1. 队列的定义
队列是一种先进先出(FIFO, First-In-First-Out)的线性数据结构,操作受限:
-
队尾(Rear):插入元素(入队,
Enqueue
)。 -
队头(Front):删除元素(出队,
Dequeue
)。
2. 队列的基本操作
操作 | 描述 | 时间复杂度 |
---|---|---|
Enqueue(x) | 元素 x 入队尾 | O(1) |
Dequeue() | 移除并返回队头元素 | O(1) |
Front() | 查看队头元素(不删除) | O(1) |
IsEmpty() | 判断队列是否为空 | O(1) |
3. 队列的实现方式
(1) 数组实现(循环队列)
-
固定大小数组:通过模运算 (
%
) 实现循环利用空间。 -
关键变量:
-
front
:指向队头。 -
rear
:指向下一个插入位置。 -
判满条件:
(rear + 1) % size == front
。
-
-
示例代码:
c
#define MAX_SIZE 100 typedef struct { int data[MAX_SIZE]; int front, rear; } CircularQueue; void Enqueue(CircularQueue* q, int x) { if ((q->rear + 1) % MAX_SIZE == q->front) return; // 队满 q->data[q->rear] = x; q->rear = (q->rear + 1) % MAX_SIZE; }
(2) 链表实现
-
动态扩容:无需预先分配固定空间。
-
示例代码:
c
typedef struct Node { int val; struct Node* next; } Node; typedef struct { Node *front, *rear; } LinkedQueue; void Enqueue(LinkedQueue* q, int x) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->val = x; newNode->next = NULL; if (q->rear == NULL) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } }
4. 队列的应用场景
-
广度优先搜索(BFS):树的层序遍历、图的最短路径。
-
任务调度:CPU任务队列、打印机任务队列。
-
消息队列:异步通信(如RabbitMQ、Kafka)。
-
缓冲区管理:数据流处理(如网络包缓冲)。
5. 特殊队列类型
类型 | 特点 | 应用场景 |
---|---|---|
双端队列(Deque) | 允许两端插入和删除(结合栈和队列特性) | 滑动窗口最大值、撤销操作 |
优先队列(Priority Queue) | 元素按优先级出队(通常用堆实现) | 任务调度、Dijkstra算法 |
循环队列 | 数组空间循环利用,解决假溢出问题 | 资源池管理 |
6. 队列 vs 堆(Heap)
特性 | 队列(Queue) | 堆(Heap) |
---|---|---|
顺序规则 | 先进先出(FIFO) | 按优先级(堆顶极值) |
操作复杂度 | 入队/出队:O(1) | 插入/删除:O(log n) |
实现 | 数组/链表 | 完全二叉树(数组存储) |
典型应用 | BFS、缓冲管理 | 排序、Top-K问题、优先队列 |