🥞 栈和队列
同样都是「放东西、取东西」的容器,栈像叠盘子——后放的先拿;队列像排队——先来的先走。循环队列再把队伍排成环形跑道,空出来的位置还能接着用。
考纲知识点:栈
队列
循环队列
队列
循环队列
📖
考纲 · 知识点详述
摘自《CCF编程能力等级认证 C++&Python 认证标准》C++ 六级
- (7)掌握栈、队列、循环队列的基本定义,应用场景和常见操作。
📚
先学一学
花 6 分钟读完下面 5 课,再去闯关就不慌啦
1
🥞 栈:后进先出,像叠盘子
食堂阿姨叠盘子:后洗好的盘子放在最上面,要用的时候也先拿最上面的。后放进去的先拿出来,英文叫 LIFO(Last In First Out,后进先出)。这就是栈(stack)。
🔢 栈的两个动作
· 入栈 push:把数据放到栈顶(叠一个盘子)。
· 出栈 pop:把栈顶的数据拿走(拿最上面的盘子)。
只能从栈顶进出,中间的盘子碰不到。
· 出栈 pop:把栈顶的数据拿走(拿最上面的盘子)。
只能从栈顶进出,中间的盘子碰不到。
💡 口诀:栈=后进先出;进进出出只走最上面的门。
📱 生活类比:浏览器「后退」按钮
先看首页,点进「新闻」,再点进「体育」。想后退时先回到「新闻」,再回到「首页」——后看的先退,这就是栈!撤销键 Ctrl+Z 也是一样:后做的操作先被撤销。
💡 口诀:后退、撤销都是栈——后来的先走。
2
🚌 队列:先进先出,像排队
游乐场排队:先来的人排在前面,先玩到;后来的人排在队尾等着。先进来的先出去,英文叫 FIFO(First In First Out,先进先出)。这就是队列(queue)。
🔢 队列的两个动作和两个口
· 入队 enqueue:从队尾加入(站到队伍最后)。
· 出队 dequeue:从队头离开(队伍最前面的人先走)。
一个口进、一个口出,秩序井然。
· 出队 dequeue:从队头离开(队伍最前面的人先走)。
一个口进、一个口出,秩序井然。
💡 口诀:队列=先进先出;队尾进、队头出,先来先服务。
🖨️ 生活类比:打印机任务排队
好多同学同时点「打印」,打印机不会插队,而是按提交的先后排成队,一份一份打。外卖订单、银行叫号也都是队列。
💡 口诀:打印、叫号都排队——先来先服务,谁也不插队。
3
🌀 循环队列:队伍排成环形跑道,空位再利用
普通排队有个小毛病:队头的人走了,前面的位置就空着,可队尾却排不下了——像一条只能往后排的长队,前面空着也浪费。解决办法是让队伍首尾相接围成一个圈,队尾走到尽头就绕回开头接着排,这就是循环队列。
🏃 生活类比:环形跑道接力
操场一圈跑道只有 8 条道,但可以一直跑下去:跑到终点线再接着绕圈跑。循环队列也一样——容量就那么多个格子,绕一圈从头再来,格子永远不浪费。
💡 口诀:队尾到头绕回 0,一圈一圈接着排,空位全利用。
🧪 读代码:队尾走一步的写法
看得懂就好,不用背——取余数 % 让下标到顶就回 0:
int q[8]; // 容量 8 的环形队伍
int front = 0, rear = 0;
// 入队:rear 前进一格,到 7 之后自动回 0
rear = (rear + 1) % 8;
q[rear] = 新来的数据;
int front = 0, rear = 0;
// 入队:rear 前进一格,到 7 之后自动回 0
rear = (rear + 1) % 8;
q[rear] = 新来的数据;
就像钟表走到 12 点又回到 1 点,永远在圈里转。
💡 口诀:加一取余 %,到顶自动绕回开头,这就是环形跑道。
4
⚖️ 易混对比:栈 vs 队列
📊 一张表分清两兄弟
· 栈:后进先出 LIFO;一头进出;像叠盘子、浏览器后退、撤销。
· 队列:先进先出 FIFO;一头进一头出;像排队、打印机任务。
· 循环队列:队列的「省空间版」,首尾相接成环。
· 队列:先进先出 FIFO;一头进一头出;像排队、打印机任务。
· 循环队列:队列的「省空间版」,首尾相接成环。
💡 口诀:栈是后进先出叠盘子,队列是先进先出排排队,循环队列是绕圈圈的排队。
5
💼 程序里它们无处不在
- 1️⃣函数调用栈:函数 A 调用函数 B,B 先做完先返回,A 再继续——后调用的先结束,正是栈。程序出错时打印的「调用栈」就是它。
- 2️⃣括号配对:检查 ( { [ 有没有配对,读到右括号时,和最近没配对的左括号比——这是栈的经典用法。
- 3️⃣消息/任务队列:App 的消息、打印任务、外卖订单都排成队列,先来先处理。
- 4️⃣循环队列/环形缓冲区:视频直播、CPU 任务、键盘输入缓冲都爱用环形的圈,数据边进边出不浪费空间。
🌟 一句话总结
要「后进先出」找栈,要「先进先出」找队列,空间紧张就把队列弯成环。
💡 口诀:函数调用与后退用栈,消息打印用队列,省空间就绕圈。
🎯
闯关小锦囊 · 考点提醒
- 栈:后进先出 LIFO,push 入栈、pop 出栈,只动栈顶;如叠盘子、后退、函数调用。
- 队列:先进先出 FIFO,enqueue 从队尾入、dequeue 从队头出;如排队、打印任务。
- 循环队列:队尾走到尽头绕回开头,空位能复用,省空间。
- 判断结构看「谁先被处理」:后到的先走是栈,先到的先走是队列。
- 函数调用是栈(后调用先返回);括号配对用栈;消息任务用队列。
🎮
学完了?来闯关!
下面 16 个小挑战,点一点就能玩
Demo 原型 · 每个知识点独立页面 · 暂不含真实编译与进度存储。