6
栈和队列
GESP 六级 · 知识点 6

🥞 栈和队列

同样都是「放东西、取东西」的容器,栈像叠盘子——后放的先拿;队列像排队——先来的先走。循环队列再把队伍排成环形跑道,空出来的位置还能接着用。

考纲知识点:
队列
循环队列
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 六级
  1. (7)掌握栈、队列、循环队列的基本定义,应用场景和常见操作。
📚
先学一学
花 6 分钟读完下面 5 课,再去闯关就不慌啦
1
🥞 栈:后进先出,像叠盘子

食堂阿姨叠盘子:后洗好的盘子放在最上面,要用的时候也先拿最上面的。后放进去的先拿出来,英文叫 LIFO(Last In First Out,后进先出)。这就是栈(stack)

🔢 栈的两个动作
· 入栈 push:把数据放到栈顶(叠一个盘子)。
· 出栈 pop:把栈顶的数据拿走(拿最上面的盘子)。
只能从栈顶进出,中间的盘子碰不到。
💡 口诀:栈=后进先出;进进出出只走最上面的门。
📱 生活类比:浏览器「后退」按钮
先看首页,点进「新闻」,再点进「体育」。想后退时先回到「新闻」,再回到「首页」——后看的先退,这就是栈!撤销键 Ctrl+Z 也是一样:后做的操作先被撤销。
💡 口诀:后退、撤销都是栈——后来的先走。
2
🚌 队列:先进先出,像排队

游乐场排队:先来的人排在前面,先玩到;后来的人排在队尾等着。先进来的先出去,英文叫 FIFO(First In First Out,先进先出)。这就是队列(queue)

🔢 队列的两个动作和两个口
· 入队 enqueue:从队尾加入(站到队伍最后)。
· 出队 dequeue:从队头离开(队伍最前面的人先走)。
一个口进、一个口出,秩序井然。
💡 口诀:队列=先进先出;队尾进、队头出,先来先服务。
🖨️ 生活类比:打印机任务排队
好多同学同时点「打印」,打印机不会插队,而是按提交的先后排成队,一份一份打。外卖订单、银行叫号也都是队列。
💡 口诀:打印、叫号都排队——先来先服务,谁也不插队。
3
🌀 循环队列:队伍排成环形跑道,空位再利用

普通排队有个小毛病:队头的人走了,前面的位置就空着,可队尾却排不下了——像一条只能往后排的长队,前面空着也浪费。解决办法是让队伍首尾相接围成一个圈,队尾走到尽头就绕回开头接着排,这就是循环队列

🏃 生活类比:环形跑道接力
操场一圈跑道只有 8 条道,但可以一直跑下去:跑到终点线再接着绕圈跑。循环队列也一样——容量就那么多个格子,绕一圈从头再来,格子永远不浪费。
💡 口诀:队尾到头绕回 0,一圈一圈接着排,空位全利用。
🧪 读代码:队尾走一步的写法
看得懂就好,不用背——取余数 % 让下标到顶就回 0:
int q[8]; // 容量 8 的环形队伍
int front = 0, rear = 0;
// 入队:rear 前进一格,到 7 之后自动回 0
rear = (rear + 1) % 8;
q[rear] = 新来的数据;
就像钟表走到 12 点又回到 1 点,永远在圈里转。
💡 口诀:加一取余 %,到顶自动绕回开头,这就是环形跑道。
4
⚖️ 易混对比:栈 vs 队列
📊 一张表分清两兄弟
· :后进先出 LIFO;一头进出;像叠盘子、浏览器后退、撤销。
· 队列:先进先出 FIFO;一头进一头出;像排队、打印机任务。
· 循环队列:队列的「省空间版」,首尾相接成环。
💡 口诀:栈是后进先出叠盘子,队列是先进先出排排队,循环队列是绕圈圈的排队。
5
💼 程序里它们无处不在
🌟 一句话总结
要「后进先出」找栈,要「先进先出」找队列,空间紧张就把队列弯成环。
💡 口诀:函数调用与后退用栈,消息打印用队列,省空间就绕圈。
🎯
闯关小锦囊 · 考点提醒
🎮
学完了?来闯关!
下面 16 个小挑战,点一点就能玩

Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。