栈与队列 · 单步演示
队列(循环队列)
一端进、另一端出的线性表:先放进去的先拿出来。用定长数组实现时,让 front、rear 走到末尾后绕回 0,就能反复利用已经空出来的格子。
0front rear
1
2
3
4
5
出队顺序(空)
步 001 / 017空的循环队列,容量 6。front 指向队头,rear 指向下一个空位;走到末尾就绕回 0。
键盘:← → 单步,空格 播放/暂停(先点一下演示区)。
伪代码 · 当前行高亮
enqueue(x):if size = cap:队满,拒绝q[rear] ← x;rear ← (rear+1) mod cap;size ← size+1dequeue():if size = 0:队空,拒绝x ← q[front];front ← (front+1) mod cap;size ← size−1;return x
变量
| front | 0 |
|---|---|
| rear | 0 |
| size | 0 |
| 容量 cap | 6 |
| 队列内容(从头到尾) | [] |
复杂度
| 最好情况 | O(1) |
|---|---|
| 平均情况 | O(1) |
| 最坏情况 | O(1) |
| 额外空间 | O(n) |
入队出队都只改一个格子和一个下标。取模让下标绕回开头,不需要整体搬移元素。
要点
- 本演示用 size 计数来区分「空」和「满」;另一种常见做法是故意空出一个格子,用 (rear+1) mod cap = front 判满。
- 广度优先搜索、层序遍历、任务排队都用队列。
常见错误
不用取模、让 rear 一直往后加,数组前面出队空出来的格子就再也用不上,出现「假溢出」。