队列详解:从概念到C语言实现
队列的基本概念
队列(Queue)是一种先进先出(First In First Out, FIFO)的线性数据结构。它只允许在表的前端(front)进行删除操作,在表的后端(rear)进行插入操作。
队列的典型特征:
- 先进先出:最先进入队列的元素将最先被移除
- 两个端点:队头(front)用于删除,队尾(rear)用于插入
- 基本操作:入队(Enqueue)、出队(Dequeue)
队列的应用场景:
1.CPU调度
2.打印机任务队列
3.消息队列
4.广度优先搜索(BFS)
队列的C语言实现
下面我们使用链表来实现队列数据结构。
头文件定义
// list.h
#ifndef LIST_H
#define LIST_H
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
typedef int QDataType;
// 队列节点结构
typedef struct QueueNode {
QDataType data;
struct QueueNode* next;
} QueueNode;
// 队列结构
typedef struct Queue {
QueueNode* phead; // 队头指针
QueueNode* ptail; // 队尾指针
} Queue;
// 函数声明
void QueueInit(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
bool QueueEmpty(Queue* pq);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
void QueueDesTroy(Queue* pq);
队列操作实现
1. 队列初始化
// 初始化队列
void QueueInit(Queue* pq)
{
assert(pq);
pq->phead = pq->ptail = NULL;
}
功能:将队列的头尾指针都置为NULL,表示空队列。
2. 入队操作
// 入队列
void QueuePush(Queue* pq, QDataType x) {
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (newnode == NULL) {
perror("malloc fail");
exit(1);
}
newnode->data = x;
newnode->next = NULL;
if (pq->phead == NULL) {
// 队列为空时,新节点既是头也是尾
pq->phead = pq->ptail = newnode;
}
else {
// 队列不为空时,将新节点连接到队尾
pq->ptail->next = newnode;
pq->ptail = newnode;
}
}
3. 判断队列是否为空
bool QueueEmpty(Queue* pq) {
assert(pq);
return pq->phead == NULL;
}
功能:检查队列是否为空,空队列返回true,否则返回false。
4. 出队操作
void QueuePop(Queue* pq) {
assert(!QueueEmpty(pq));
if (pq->phead == pq->ptail) {
// 队列中只有一个元素
free(pq->phead);
pq->phead = pq->ptail = NULL;
}
else {
// 队列中有多个元素
QueueNode* del = pq->phead;
pq->phead = pq->phead->next;
free(del);
del = NULL;
}
}
5. 获取队头元素
QDataType QueueFront(Queue* pq) {
assert(!QueueEmpty(pq));
return pq->phead->data;
}
功能:返回队头元素的值,但不删除它。
6. 获取队尾元素
// 取队尾数据
QDataType QueueBack(Queue* pq)
{
assert(!QueueEmpty(pq));
return pq->ptail->data;
}
7. 获取队列大小
int QueueSize(Queue* pq)
{
assert(pq);
QueueNode* pcur = pq->phead;
int size = 0;
while (pcur)
{
++size;
pcur = pcur->next;
}
return size;
}
8. 销毁队列
void QueueDesTroy(Queue* pq) {
assert(pq);
QueueNode* pcur = pq->phead;
while (pcur) {
QueueNode* next = pcur->next;
free(pcur);
pcur = next;
}
pq->phead = pq->ptail = NULL;
}
测试示例
// test.c
#include "list.h"
void TestQueue() {
Queue q;
QueueInit(&q);
// 测试入队
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
printf("队列大小: %d\n", QueueSize(&q));
printf("队头元素: %d\n", QueueFront(&q));
printf("队尾元素: %d\n", QueueBack(&q));
// 测试出队
printf("出队顺序: ");
while (!QueueEmpty(&q)) {
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
printf("\n");
QueueDesTroy(&q);
}
int main() {
TestQueue();
return 0;
}
C语言实现队列详解
1693

被折叠的 条评论
为什么被折叠?



