本节复习队列。
首先回顾队列的性质:先入先出。 队列的特点就是先入先出, 先入队列的在队列的头部。 后入队列的在队列的尾部。
目录
队列的全部接口
//队列的初始化
void QueueInit(Queue* pq);//队尾入队列
void QueuePush(Queue* pq, QDataType x);//对头出队列
void QueuePop(Queue* pq);//获得队列头部元素
QDataType QueueHead(Queue* pq);//获取队列尾部元素
QDataType QueueTail(Queue* pq);//获取队列中有效个数
int QueueSize(Queue* pq);//判断队列是否为空
bool QueueEmpty(Queue* pq);//队列的销毁
void QueueDestroy(Queue* pq);
---------------------------------------------------------------------------------------------------------------------------------------
准备文件
首先包含三个文件一个main.c文件, 一个.h文件用于函数声明, 还有一个.c文件用于函数的实现
创建队列的结构体蓝图
首先包含一下头文件,另外冲新定义一下要保存的数据类型。 便于维护。
然后我们要用链式结构标识队列, 所以需要定义一个链表节点的结构体。
最后创建队列的结构体。
队列的初始化
链式队列是没有哨兵位的头节点的。 所以在初始化的时候要将队列的头指针和尾指针都置空
.h函数声明
.c函数实现
--------------------------------------------------------------------------------------------------------------------------------------
队尾入队列
队列符合先入先出。 队列入数据时都是在队尾入数据。
这里需要注意的是, 当头指针和尾指针都指向空的时候, 也就是队列之中无数据的时候, 应该让队头和队尾都指向该节点。如图
然后剩下的操作就是很简单的单链表尾插。 而且不需要自己遍历找数据, 只需要在tail指针所指向节点之后插入数据即可。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
对头出队列
队列符合先入先出的原则, 先入的数据在队头的位置, 数据要从对头出数据。
对于链式队列来说, 对头出数据就是单链表的头删操作。
.h函数声明
.c函数实现
----------------------------------------------------------------------------------------------------------------------------------------
获取队列头部元素
队列不同于栈, 栈只能从出数据的一方也就是栈顶获取数据。而队列既可以从出数据的一方获取数据, 又可以从入数据的一方获取数据。
该函数实现的是从队头获取数据。 也就是head指针所指向节点内保存的数据。
如图
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
获取队列尾部元素
获取队尾数据获取tail指针所指向的数据。
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
获取队列中有效元素个数
队列和栈不同, 队列之中没有专门的成员变量储存队列的数据个数, 所以我们要用单链表的计算节点的方法。 直接定义一个变量, 从队头开始遍历, 计算节点的个数。
如图:
.h函数声明
.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
判断队列是否为空
要判断队列是否为空, 只要判断head或者tail指针指向的是否是空。 因为head指针和tail指针除非在队列没有元素的情况下指向空。 其他时候都会指向一个节点。
如图为不断出队列的过程图:
由此我们可以发现, 只有当队列为空的时候, head和tail才会指向空。
.h函数声明.c函数实现
---------------------------------------------------------------------------------------------------------------------------------------
销毁队列
销毁队列的过程和单链表的销毁过程类似。如果忘记的话就复习单链表:线性表——单链表的增删查改-CSDN博客
.h函数声明
.c函数实现