数据结构——队列的链式结构实现

Posted aaaaaaaWoLan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——队列的链式结构实现相关的知识,希望对你有一定的参考价值。

队列

队列的概念及结构

大家买过茶颜悦色的话想必就知道排队的队伍是多么庞大了

队列就像我们平时排队的特点一样,排在前面的先买到奶茶。

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out,也就是先进先出) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

队列的实现——链式结构

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数
组头上出数据,效率会比较低。

队列是需要队首和队尾的,所以我们需要考虑一个问题:如何判断队列是否为空?

是判断队首等于队尾吗?还是队首为空?

如果用队首等于队尾判断队列是否为空的话,是不准确的,当队列中只有一个元素时,队首和队尾也相等,可是此时队列并不为空,所以不能用这个来作为判断条件。

所以我们是通过判断队首是否为空来判断队列是否为空。

链式结构的队列

进队:

出队:

Queue.h:

// 链式结构:表示队列
typedef int tp;

typedef struct QueueNode {
	struct QueueNode* next;
		tp data;
}q;

typedef struct Queue {
	q* head;
	q* tail;
}qu;

//初始化队列
void QueueInit(qu* p);

//销毁队列
void QueueDestroy(qu* p);

//插入数据
void QueuePush(qu* p, tp x);

//删除数据
void QueuePop(qu* p);

//返回队首
tp QueueFront(qu* p);

//返回队尾
tp QueueBack(qu* p);

//返回队列大小
tp QueueSize(qu* p);

//判断队列是否为空
bool QueueEmpty(qu* p);

Queue.c:

#include"queue.h"

//将队列初始化
void QueueInit(qu* pq)
{
	assert(pq != NULL);
	pq->head = pq->tail = NULL;
}

//销毁队列
void QueueDestroy(qu* pq)
{
	assert(pq != NULL);
	assert(!QueueEmpty(&pq));

	q* cur = pq->head;
	while (cur != NULL)
	{
		qu* tmp = cur->next;
		free(cur);
		cur = tmp;
		tmp = NULL;
	}
	cur = NULL;
	pq->head = pq->head = NULL;
}

//元素入队尾
void QueuePush(qu* pq, tp x)
{
	assert(pq != NULL);

	q* newnode = (q*)malloc(sizeof(q));
	newnode->data = x;
	newnode->next = NULL;

	if (pq->head == NULL)//空队列时入队要特殊处理
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}

//队首元素出队
void QueuePop(qu* pq)
{
	assert(pq != NULL);
	assert(!QueueEmpty(&pq));
	
	if (pq->head == pq->tail)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}

	q*tmp = pq->head->next;
	free(pq->head);
	pq->head = tmp;
}

//返回队首元素
tp QueueFront(qu* pq)
{
	assert(pq != NULL);
	assert(!QueueEmpty(&pq));

	return pq->head->data;
}

//返回队尾元素
tp QueueBack(qu* pq)
{
	assert(pq != NULL);
	assert(!QueueEmpty(&pq));

	return pq->tail->data;
}

//返回队列大小
tp QueueSize(qu* pq)
{
	assert(pq != NULL);
	assert(!QueueEmpty(&pq));
	
	int count = 0;
	q* cur = pq->head;
	while (cur != NULL)
	{
		count++;
		cur = cur->next;
	}

	return count;
}

/
bool QueueEmpty(qu* pq)
{
	assert(pq != NULL);

	return pq->head == NULL;
}

另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型
时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。

以上是关于数据结构——队列的链式结构实现的主要内容,如果未能解决你的问题,请参考以下文章

Python数据结构系列☀️《队列(顺序队列链式队列双端队列)》——知识点讲解+代码实现☀️

数据结构学习笔记——链式存储结构实现队列(链队)

数据结构学习笔记——链式存储结构实现队列(链队)

[数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)

数据结构——队列的链式结构实现

队列的链式存储结构及实现