队列
一、为什么要学习队列
在排队系统中,顾客去拿自己号码顺序,先拿到的一定先被叫号。
这种先进先出FIFO(First In First Out)
的模式被称为队列
队列顾名思义,排队,按顺序进入,按顺序出去
🍎只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
进行插入操作的一端称为队尾
,进行删除操作的一端称为队头
二、队列的接口
在这种线性表的类型,可以是定义数组来实现,也可以定义链表来实现。
二者如何抉择?
因为涉及到元素移动,显然数组会很麻烦,而链表就很简单,只需要指针移动就行
所以下面接口以链表实现队列
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode* next;
QDataType data;
}QueueNode;
这样队列的定义还不能结束,代表一个队列,我们可能需要一头一尾,一个控制队头一个控制队尾
但每次定义一个队列的时候都要先定义两个变量很麻烦
所以我们定义一个结构体变量,一个指针记录队头,一个指针记录队尾
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
}Queue;
1. 队列初始化
头和尾都置空
//队列初始化
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
2. 进队
🍬head为空链表:
🍬head不为空链表:
//进队
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->data = x;
newnode->next = NULL</