[C语言实现]数据结构之《关于我转生成队列这档事》

这篇具有很好参考价值的文章主要介绍了[C语言实现]数据结构之《关于我转生成队列这档事》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[C语言实现]数据结构之《关于我转生成队列这档事》


🥰作者: FlashRider

🌏专栏: 数据结构

🍖知识概要:详解队列的概念、顺序队列和链式队列的优点和缺点,以及代码实现。

目录

什么是队列?

选择什么结构来实现队列?

链式队列的实现

队列的结构体实现

队列需要的函数声明

队列的函数实现

测试代码


什么是队列?

队列其实就是一种操作受限的线性表(即:只能在表头弹出,表尾插入)。
我们把数据的删除端称为队头,把数据的插入端称为队尾
生活中,我们在食堂打饭排队的时候,从队尾进入队列,我们前面的人打完饭后从队头离开队列。
由此可见,队列这种结构也是非常重要的,在生活中随处可见。

[C语言实现]数据结构之《关于我转生成队列这档事》

选择什么结构来实现队列?

我们需要对队列进行插入删除操作的时候,都是从队尾插入,队头删除,因此我们选用链式结构来实现队列(链表实现队列),如果我们采用顺序结构(顺序表)来实现队列的话,在删除之后就要进行大量的数据挪动,如果不挪动就会造成一定程度的空间浪费。

那么我们选用单链表,还是双链表来实现队列?
如果我们选择双向链表来实现队列,在进行插入删除的时候会非常轻松,但是总有一种大材小用的感觉。如果我们选用单链表实现队列,我们就要实现头删和尾插,但是尾插需要找尾,这对于单链表来说是O(n)的时间复杂度,因此我们新建一个结点tail来存储尾结点,这样尾插就是O(1)了。

[C语言实现]数据结构之《关于我转生成队列这档事》

链式队列的实现

需要的头文件:  stdlib.h        stdbool.h        assert.h        stdio.h

队列的结构体实现

//队列元素类型 
typedef int QDataType;
//链式队列结点
typedef struct QueueNode
{
	QDataType x;
	struct QueueNode* next;
}QNode;
//队列 
typedef struct Queue
{
	QNode* front;//队头
	QNode* tail;//队尾 
}Queue;

队列需要的函数声明

首先是老四样: 初始化、插入删除、获取长度、销毁。
其次还有:判空、获取队头元素、获取队尾元素。

void QueueInit(Queue* pq);//初始化队列 
void QueuePush(Queue* pq, QDataType x);//队尾插入元素
void QueuePop(Queue* pq);//删除队头元素
bool QueueEmpty(Queue* pq);//判断队列是否为空
int QueueSize(Queue* pq);//获取队列长度
QDataType QueueFront(Queue* pq);//获取队头元素 
QDataType QueueBack(Queue* pq);//获取队尾元素 
void QueueDestroy(Queue* pq);//销毁队列 

队列的函数实现

//初始化队列 
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->front = pq->tail = NULL;
}
//队尾插入元素 
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	//如果队列为空 front也会改变 所以特判 
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->data = x;
	newnode->next = NULL;
	if(pq->front == NULL)
		pq->front = pq->tail = newnode;
	else
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;
	}
}
//删除队头元素 
void QueuePop(Queue* pq)
{
	assert(!(QueueEmpty(pq)));
	//如果只有一个元素 tail也会改变 所以特判
	QNode* del = pq->front;
	if(pq->front == pq->tail)
		pq->front = pq->tail = NULL;
	else pq->front = pq->front->next;
	free(del);
}
//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->front == NULL;
}
//获取队列长度 
int QueueSize(Queue* pq)
{
	assert(pq);
	int cnt = 0;
	QNode* cur = pq->front;
	while(cur)
	{
		cnt++;
		cur = cur->next;
	}
	return cnt;
}
//获取队头元素 
QDataType QueueFront(Queue* pq)
{
	assert(!QueueEmpty(pq));
	return pq->front->data;
}
//获取队尾元素 
QDataType QueueBack(Queue* pq)
{
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}
//销毁队列 
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->front;
	while(cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->front = pq->tail = NULL;
}

测试代码

int main(void)
{
	Queue q;
	QueueInit(&q);
	printf("插入前QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("插入后QueueSize >> %d\n\n", QueueSize(&q));
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePush(&q, 5);
	printf("插入后QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("插入后QueueSize >> %d\n\n", QueueSize(&q));
	while(!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	printf("\n");
	printf("全部弹出后QueueIsEmpty >> %d (1真0假)\n", QueueEmpty(&q));
	printf("全部弹出后QueueSize >> %d\n", QueueSize(&q));
	return 0;
}

运行结果:

[C语言实现]数据结构之《关于我转生成队列这档事》

如果这篇博客对您有帮助的话,请记得点个赞或者三连。 文章来源地址https://www.toymoban.com/news/detail-489978.html


到了这里,关于[C语言实现]数据结构之《关于我转生成队列这档事》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 队列--C语言实现数据结构

    本期带大家一起用C语言实现队列🌈🌈🌈 队列是一种线性数据结构,它按照先进先出(FIFO)的原则进行操作。可以把队列想象成排队买票或者排队上公交车的队伍。 顺序队列 由一个连续的内存区域组成,可以存储多个元素。队列有两个指针,分别指向队头(Front)和队尾(

    2024年02月16日
    浏览(37)
  • 数据结构——队列(C语言实现)

    队列是一种特殊的线性结构,数据只能在一端插入,数据也只能在另一端进行删除。插入数据的那一端称之为队尾,插入数据的动作称之为入队。删除数据的那一端称之为队头,删除数据的动作称之为出列。队列遵守的是FIFO原则(Frist In First Out),即先进先出原则。 队列具

    2024年02月03日
    浏览(79)
  • C语言实现队列--数据结构

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–数据结构🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一

    2024年02月05日
    浏览(45)
  • 数据结构:队列(Python语言实现)

    队列是一种 先进先出 的数据结构(特殊的线性结构),在队列 尾部 插入新元素,在队列 头部 删除元素。 一般队列的基本操作如下: create:创建空队列。 enqueue:将新元素加入队列的尾部,返回新队列。 dequeue:删除队列头部元素,返回新队列。 front:返回队列头部的元素

    2024年02月13日
    浏览(45)
  • 数据结构 栈(C语言实现)

            时间就是生命,时间就是速度,时间就是气力。——郭沫若;本章继续学习数据结构,本章主要讲了什么是栈以及栈的基本功能和实现方法。    话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记

    2024年02月09日
    浏览(41)
  • C语言实现栈--数据结构

    魔王的介绍:😶‍🌫️一名双非本科大一小白。 魔王的目标:🤯努力赶上周围卷王的脚步。 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍🔥大魔王与你分享:“断剑重铸的锐雯败于菲奥娜,原来破镜重圆的爱到处都是破绽”。 栈是一种特殊的线性表,其只允许在固定的

    2023年04月22日
    浏览(35)
  • 堆--C语言实现数据结构

    本期带大家一起用C语言实现堆🌈🌈🌈 堆(Heap)是一种特殊的树状数据结构,它是一种完全二叉树。堆被广泛应用于优先队列、排序算法等领域。 堆的特点: 堆分为最大堆和最小堆两种类型。最大堆中,父节点的值大于或等于其子节点的值;最小堆中,父节点的值小于或

    2024年02月16日
    浏览(37)
  • 栈--C语言实现数据结构

    本期带大家一起用C语言实现栈🌈🌈🌈 栈是一种常见的数据结构,它遵循后进先出(Last In, First Out)的原则。可以将其类比为现实生活中的一摞书或者一叠盘子。 栈由一个连续的内存区域组成,可以存储一系列的元素。在栈的一端称为栈顶,另一端称为栈底。 栈的主要操作

    2024年02月16日
    浏览(40)
  • 数据结构——堆(C语言实现)

    堆是一种特殊的数据结构,它是一棵完全二叉树,同时满足堆属性,即父节点的值总是大于或小于其子节点的值。如果父节点的值总是大于子节点的值,那么我们称之为大根堆;反之,如果父节点的值总是小于子节点的值,那么我们称之为小根堆。在堆中,根节点的值最大(

    2024年02月08日
    浏览(39)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包