数据结构【队列】值得一看!

在这里插入图片描述

✨Blog:🥰不会敲代码的小张:)🥰
🉑推荐专栏:C语言🤪Cpp😶‍🌫️数据结构初阶💀
💽座右铭:“記住,每一天都是一個新的開始😁😁😁
💀本章内容:《队列》的介绍✨

队列思想

队列,就是常用的数据结构之一。队列的特征是先进先出(First-In-First-Out),就相当于我们现实中排队的样子。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,以及在表的后端(back)进行插入操作。和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在这里插入图片描述

队列的创建

下面代码中用结构体把指针给封装了起来,方便后续使用。
如果不封装起来,后面函数传参的时候,会比较麻烦

typedef int QDatatype;
//队列节点
typedef struct QueueNode
{
	struct QueueNode* next;
	QDatatype data;
}QNode;
//我们这里用结构体把队列的指针封装起来
typedef struct Queue
{
	QNode* head;//头指针
	QNode* tail;//尾指针
	int size;
}Queue;

初始化

最开始头指针尾指针都为空,size为0

void QueueInit(Queue* pq)
{
	assert(pq);

	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

销毁

创建一个cur指针指向队头,while循环,如果cur不为空就说明里面还有数据,保留cur下一个指针的位置,释放当前cur,然后再把刚刚保留的next指针给cur。

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

插入

首先我们malloc一个空间,然后把要插入进去的数据放进data里,next掷为空,如果队头为空,那么就是一个空队列(队尾如果不是空就出问题了,所以断言一下),我们需要把newnode赋值给队头队尾,如果队头不为空,那么我们就只需要在队尾的位置插入,然后再更新队尾指针即可。

void QueuePush(Queue* pq, QDatatype x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	
	if (pq->head == NULL)
	{
		assert(pq->tail == NULL);
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

删除

既然是删除,那么队列里一定要有数据,所以要先断言,如果头指针和尾指针相等,说明队列只有一个元素,那么直接free即可,那么else我们需要先保留队头的指针,和队头下一个的指针位置,然后free掉队头元素,再把刚刚保留的next指针更新到对头。

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	if (pq->head == pq->tail)
	{
		free(pq->head);
		pq->head = NULL;
		pq->tail = NULL;
	}
	else
	{
		QNode* del = pq->head;
		QNode* next = pq->head->next;
		free(del);
		del = NULL;
		pq->head = next;
	}
	pq->size--;
}

队列的大小

直接返回size

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

判空

用bool做为返回值,如果队头和队尾都为空,那么就是空队列。

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL && pq->tail == NULL;
}

返回队头数据

队列不能为空,然后直接返回队头指向的元素

QDatatype QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

返回队尾数据

队列不能为空,然后直接返回队尾指向的元素

QDatatype QueueBack(Queue* pq) 
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的小张:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值