🐸一、队列的概念及结构
🍄1、队列的概念定义
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
- 入队列:进行插入操作的一端称为队尾
- 出队列:进行删除操作的一端称为队头
🍄2、动图演示
🌰可以想象成排队去食堂打饭,前面先打完饭的就从队头先走了,后来的就需要在后面队尾继续排队
🐸二、队列的实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
🐸三、链表结构队列详解
🍎创建队列的结构
🥰这里先创建三个文件:
1️⃣:Queue.h文件,用于函数的声明
2️⃣:Queue.c文件,用于函数的定义
3️⃣:Test.c文件,用于测试函数
建立三个文件的目的: 将队列作为一个项目来进行编写,方便我们的学习与观察。
⭕接口1:定义结构体(QNode、Queue)
🚩这里需要定义两个结构体:QNode、Queue,分别表示:队列链表每个节点结构和整个队列链表结构
🥰请看代码与注释👇
//自定义类型 typedef int QDataType; //队列链表每个节点结构 typedef struct QueueNode { struct QueueNode* next; QDataType data; }QNode; //整个队列链表结构 typedef struct Queue { QNode* phead; QNode* ptail; int size; }Queue;
⭕接口2:初始化(QueueInit)
🥰请看代码与注释👇
//初始化 void QueueInit(Queue* pq) { //断言传入指针不为NULL assert(pq); pq->phead = NULL; pq->ptail = NULL; pq->size = 0; }
⭕接口3:销毁(QueueDestroy)
🥰请看代码与注释👇
//销毁 void QueueDestroy(Queue* pq) { //断言传入指针不为NULL assert(pq); QNode* cur = pq->phead; while (cur) { QNode* next = cur->next; free(cur); //释放 cur = next; } pq->phead = pq->ptail = NULL; pq->size = 0; }
⭕接口4:入队列(QueuePush)
🥰请看代码与注释👇
//入队列 void QueuePush(Queue* pq, QDataType x) { assert(pq); QNode* newnode = (QNode*)malloc(sizeof(QNode)); if (newnode == NULL) { perror("malloc fail\n"); return; } newnode->data = x; newnode->next = NULL; if (pq->ptail == NULL) //如果没有节点(空队列) { assert(pq->phead == NULL); pq->phead = pq->ptail = newnode; } else //非空队列 { pq->ptail->next = newnode; pq->ptail = newnode; } pq->size++; }