一 队列的基本概念:
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)受限的线性数据结构。**元素从栈的顶部添加,从栈的顶部移除。**栈通常用于实现涉及回溯或解决递归问题的算法。
队列和栈是基础数据结构,具有不同的特性和应用。队列适用于按顺序管理项,而栈适用于实现涉及回溯或解决递归问题的算法。