GESP6级C++考试语法知识(十五、数据结构(一、认识栈 Stack))


第一课《神秘的薯片桶------认识栈 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

  • 单调栈

  • 表达式计算

  • 括号匹配

都会用到今天的思想!

所以:

今天这一课,

其实是很多算法的大门!

相关推荐
方便面不加香菜2 小时前
C++ 日期类的实现
开发语言·c++
小米渣的逆袭2 小时前
C++面试题整理
c++·面试
code monkey.2 小时前
【Linux之旅】Linux 线程同步与互斥实战:从锁机制到生产消费模型全指南
linux·c++·线程·同步·互斥
我能坚持多久2 小时前
STL详解——list的模拟实现
c++·windows·list
雪度娃娃2 小时前
行为型设计模式——命令模式
c++·设计模式·命令模式
我能坚持多久2 小时前
STL详解——list的介绍以及功能展示
开发语言·c++
大大杰哥2 小时前
2026陕西省ICPC省赛补题(前六题)
c++·算法
Brilliantwxx2 小时前
【C++】 继承与多态(上)
开发语言·c++·笔记·算法
不负岁月无痕2 小时前
STL -- C++ string 类 模拟实现
java·开发语言·c++