
第一课《神秘的薯片桶------认识栈 Stack》
🌟一、故事开场:薯片桶里的秘密
1、在遥远的「数据结构王国」里,住着一位奇怪的厨师:
👨🍳薯片大师 Stackman!
2、他有一个神奇的薯片桶。
这个桶很特别:
只能从顶部放薯片
只能从顶部拿薯片
下面的薯片永远压在最底下
3、有一天,小勇士阿 C 来到了厨房。
(1)他先放进去:
番茄味薯片
(2)接着又放进去:
黄瓜味薯片
(3)最后又放进去:
烤肉味薯片
(4)现在桶里变成了:
↑ 桶顶
烤肉味
黄瓜味
番茄味
↓ 桶底
4、🤔问题来了!
(1)现在阿 C 想拿薯片。
请问:
他最先拿到的是谁?
(2)很多同学会说:
"当然是第一个放进去的番茄味呀!"
(3)结果 Stackman 笑着说:
❌ 不对!
因为:
桶只能从顶部拿!
(4)所以最先拿到的是:
✅ 烤肉味!
5、🌟这就是今天的主角:
🎯栈(Stack)
🌟二、什么是栈?
1、栈是一种特殊的数据结构。
(1)它有一个非常重要的规则:
⚡后进先出
(2)英文叫:
LIFO
(3)全称:
Last In First Out
最后进入,最先出去
🌟三、生活中的"栈"
其实生活里到处都有栈!
🍽️例子1:叠盘子
食堂阿姨把盘子一个一个叠起来:
5号盘
4号盘
3号盘
谁最先被拿走?
✅ 最上面的 5号盘!
📚例子2:书堆
你把书一本一本放:
漫画书
数学书
语文书
想拿语文书怎么办?
❌ 不行!
必须先拿走上面的书。
🎮例子3:游戏撤回
很多游戏:
最后一步先撤销
最新操作先取消
这也是栈!
🌟四、栈的四种基本操作
栈虽然厉害,但基本动作就几个。
就像一个只会四招的大侠。
1、⚔️第一招:push(压栈)
(1)意思:
👉 放进去
(2)比如:
push(5)
(3)表示:
把 5 放进栈里。
2、🌟演示
(1)开始时:
空
(2)放入 5:
5 ← 栈顶
(3)再放入 8:
8 ← 栈顶
5
(4)再放入 3:
3 ← 栈顶
8
5
3、⚔️第二招:pop(出栈)
意思:
👉 把顶部元素拿走
4、🌟演示
(1)现在:
3 ← 栈顶
8
5
(2)执行:
pop();
(3)3 被拿走!
变成:
8 ← 栈顶
5
5、⚔️第三招:top(查看栈顶)
意思:
👉 偷偷看看顶部是谁
但不拿走。
6、🌟演示
(1)现在:
8 ← 栈顶
5
(2)执行:
top();
(3)得到:
8
(4)但栈不变!
7、⚔️第四招:empty(是否为空)
意思:
👉 栈里还有没有东西?
8、🌟演示
(1)如果:
空
(2)那么:
empty()
(3)结果:
true
🌟五、要理解"后进先出"
1、这是今天最重要的部分!
很多同学会背:
后进先出
但没有真正理解。
现在我们来玩一个小游戏。
2、🎮小游戏:《猜猜看》
汉克老师准备了一个不透明的圆桶。
规定:
只能从圆桶顶部放球进去
同样只能从圆桶顶部拿球出来
🌟步骤1
放入红球:
红
🌟步骤2
再放蓝球:
蓝 ← 顶部
红
🌟步骤3
再放黄球:
黄 ← 顶部
蓝
红
🤔现在拿球!
第一个出来的是谁?
✅ 黄球!
第二个呢?
✅ 蓝球!
最后:
✅ 红球!
🌟规律发现
最后进去:
黄
最先出来!
这就是:
🌟后进先出!
🌟六、用数组实现一个栈
终于来到真正的 C++程序实践了!
1、🌟栈像什么?
可以把数组想成:
一个一个的小柜子
比如:
int st[100];
表示:
100 个柜子。
2、🌟还需要一个"栈顶指针"
我们需要知道:
👉 现在顶部在哪。
于是:
int top = 0;
3、🤔top 是什么?
可以理解成:
当前栈里有多少个元素
🌟七、push 的实现
1、🎯目标
把元素放进去。
2、🌟代码
st[top] = x;
top++;
3、🌟过程理解
(1)假设:
top = 0
(2)执行:
push(5)
(3)实际上:
第一步
st[0] = 5;
数组:
5
第二步
top++;
变成:
top = 1
表示:
栈里已经有 1 个元素了。
🌟八、pop 的实现
1、🌟代码
top--;
2、🤔为什么不用删除?
因为:
我们只需要:
👉 让 top 往回退。
就像:
"这个位置不用了"
🌟九、完整代码(数组栈)
#include <iostream>
using namespace std;
int st[100];
int top = 0;
int main() {
// push
st[top] = 5;
top++;
st[top] = 8;
top++;
st[top] = 3;
top++;
// 输出栈顶
cout << "栈顶元素:" << st[top - 1] << endl;
// pop
top--;
cout << "弹出后栈顶:";
cout << st[top - 1] << endl;
return 0;
}
🌟十、运行过程动画
1、初始:
空
top = 0
2、push(5)
5
top = 1
3、push(8)
8 ← 顶
5
top = 2
4、push(3)
3 ← 顶
8
5
top = 3
5、pop()
8 ← 顶
5
top = 2
🌟十一、课堂超级总结
1、🎯栈的特点
✅ 只能操作顶部
✅ 后进先出
2、🎯四大操作
| 操作 | 作用 |
|---|---|
| push | 放入 |
| pop | 删除顶部 |
| top | 查看顶部 |
| empty | 判空 |
3、🎯生活中的栈
✅ 薯片桶
✅ 叠盘子
✅ 撤回操作
✅ 书堆
🌟十二、课后挑战(举一反三)
🎮挑战1
依次压栈:
1 2 3 4
请问:
出栈顺序是什么?
🎮挑战2
如果:
栈顶
7
2
9
执行一次 pop 后:
新的栈顶是谁?
🎮挑战3
为什么浏览器"后退"适合用栈?
试着自己解释!
🌟十三、今天所学的知识
最重要的不是代码。
而是:
🌟脑子里要真正出现"压上去"和"弹出来"的画面。
以后学:
DFS
单调栈
表达式计算
括号匹配
都会用到今天的思想!
所以:
今天这一课,
其实是很多算法的大门!