数据结构:队列

一 队列的基本概念:

1.队列的定义:

队列(Queue)简称队,也是和栈一样是一种受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。这和我们日常生活中的排队是一致的,最早排队的也是对早离队的,其操作的特性就是先进先出(First In First Out FIFO)。
队头 (Front) 允许删除的一端,又称队首。
队尾(Rear) 允许插入的一端。
空队列 不含元素的空链表。

二 队列的链式存储结构:

1.队列的存储结构:

复制代码
typedef int QDataType;
typedef struct QueueNode
{
	int val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

2.队列的所有接口:

复制代码
//队列的初始化、销毁
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);

// 入队列、 出队列
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);

//获取队头、队尾元素
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);

//判断队列是否为空
bool QueueEmpty(Queue* pq);

//获取队列元素个数
int QueueSize(Queue* pq);

3.队列的初始化:

复制代码
void QueueInit(Queue* pq)
{
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

输出:

4.队列的销毁:

复制代码
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

销毁:

5.入队列:

复制代码
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* Newnode = (QNode*)malloc(sizeof(QNode));
	if (Newnode == NULL)
	{
		perror("malloc error");
		exit(-1);
	}
	Newnode->next = NULL;
	Newnode->val = x;
	if (pq->ptail)
	{
		pq->ptail->next = Newnode;
		pq->ptail = Newnode;
	}
	else
	{
		pq->phead = pq->ptail = Newnode;//当最开始的时候我们让phead,ptail指针都指向Newnode
	}
	pq->size++;
}

输出:

6.出队列:

复制代码
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->phead != NULL);

	// 一个节点
	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	// 多个节点
	else
	{
		QNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}

	pq->size--;
}

输出:

7.获取队顶元素:

复制代码
QDataType QueueFront(Queue* pq)
{
	return pq->phead->val;
}

输出:

8.获取队尾数据:

复制代码
QDataType QueueBack(Queue* pq)
{
	return pq->ptail->val;
}

输出:

9.获取有效数据个数:

复制代码
int QueueSize(Queue* pq)
{
	return pq->size;
}

输出:

10.判断队列是否为空:

复制代码
bool QueueEmpty(Queue* pq)
{
	if (pq->ptail == NULL)
	{
		return false;
	}
	else
	{
		return true;
	}
}

输出:

11.打印队列:

队列与栈的总结:

队列 是一种遵循先进先出(FIFO)受限的线性数据结构。元素从队列的尾部添加,从队列的头部移除。队列通常用于模拟现实世界中按到达顺序处理项目的场景。

是一种遵循后进先出(LIFO)受限的线性数据结构。**元素从栈的顶部添加,从栈的顶部移除。**栈通常用于实现涉及回溯或解决递归问题的算法。

队列和栈是基础数据结构,具有不同的特性和应用。队列适用于按顺序管理项,而栈适用于实现涉及回溯或解决递归问题的算法。

相关推荐
动词ing1 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
l1t1 小时前
用superpi、tinypi、tpi等工具计算圆周率的比较
c语言·算法
a187927218311 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表
zcmodeltech2 小时前
火电厂模型能演示冷态启动和故障处理吗?——基于STM32与Modbus RTU的集控实训控制系统设计
数据结构·stm32·单片机·嵌入式硬件·能源
Doubbbbbbble云3 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫3 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
零依赖极客3 小时前
Day 8·1 自注意力机制:Q·K^T/softmax/V的在线计算
c语言·arm开发·人工智能·llama
水饺编程5 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2955 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
无忧.芙桃5 小时前
嵌入式(一):嵌入式历史与计算机基础:从 ENIAC 到 MCU 四大技术方向
c语言·单片机·嵌入式硬件·计算机