news 2026/7/21 3:39:14

小学生学C++编程语法知识(STL容器(6、认识Stack(栈)))

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
小学生学C++编程语法知识(STL容器(6、认识Stack(栈)))


STL课程

第六课:《魔法盘子塔——认识Stack(栈)》

本课目标

  1. 理解什么是 Stack(栈)。

  2. 掌握后进先出(LIFO)的特点。

  3. 熟练使用push()pop()top()size()empty()

  4. 能够利用 Stack 完成简单模拟。

  5. 为以后学习括号匹配、DFS、表达式计算打基础。


第一幕 食堂里的盘子

今天。

程序王国的食堂开饭了。

阿姨把盘子一个一个叠起来。


画图:

🍽 🍽 🍽 🍽 🍽

请问:

如果现在拿盘子。

应该拿哪一个?

同学们都会回答:

最上面的。


继续问:

为什么?


因为:

如果先拿最下面那个。

整个盘子塔都会倒下来。


所以。

只能拿最上面的盘子。


第二幕 什么叫后进先出?

第一个放进去的是:

①号盘子。

后来放进去:

②号。

③号。

④号。

⑤号。


画图:

顶部 ⑤ ④ ③ ② ① 底部

请问:

谁最先拿出来?

答案:

⑤号。


也就是说:

最后放进去。

最先拿出来。


总结:

这就是:

后进先出


英文:

LIFO

(Last In First Out)

后来的先走,先来的后走。


第三幕 Queue和Stack有什么不同?

画图。

Queue:

😀 😀 😀 😀 ↑ ↑ 出 进

Stack:

🍽 🍽 🍽 ↑ 进、出

总结:

Queue:

两头操作。


Stack:

永远只操作:

顶部。


第四幕 请出Stack

头文件:

#include<iostream> #include<stack> using namespace std;

创建Stack。

stack<int> st;

解释:

stack

表示:

栈。


int

保存整数。


st

变量名字。


第五幕 放盘子——push()

先放:

10

st.push(10);

盘子:

10

继续:

st.push(20);

变成:

20 10

继续:

st.push(30);

变成:

30 20 10

强调:

push永远放最上面。


第六幕 拿盘子——pop()

现在拿盘子。

st.pop();

谁离开?


当然:

30。

变成:

20 10

再:

st.pop();

变成:

10

老师强调:

pop永远删除栈顶。


第七幕 看看最上面的盘子

请问:

最上面是谁?


直接:

st.top()

例如:

cout<<st.top();

输出:

20

top。

就是:

顶部。


第八幕 栈还有几个盘子?

st.size();

例如:

cout<<st.size();

输出:

2

第九幕 栈空了吗?

st.empty();

例如:

if(st.empty()) { cout<<"没有盘子"; }

第十幕 Stack不能这样做

请问:

Vector:

a[3]

Stack:

可以吗?


答案:

不能。


请问:

Queue:

可以遍历吗?

也不能。


Stack:

更加不能。

因为。

Stack只能看到:

顶部。


第十一幕 演示程序

#include<iostream> #include<stack> using namespace std; int main() { stack<int> st; st.push(10); st.push(20); st.push(30); cout<<"栈顶:"<<st.top()<<endl; st.pop(); cout<<"新的栈顶:"<<st.top()<<endl; cout<<"元素个数:"<<st.size()<<endl; return 0; }

输出:

栈顶:30 新的栈顶:20 元素个数:2

第十二幕 课堂小游戏

依次执行:

push(5) push(8) push(2) pop() push(9)

请画图。

开始:

5

8 5

2 8 5

8 5

9 8 5

请问:

top是谁?

答案:

9

第十三幕 课堂实践一——撤销功能(Undo)

请问:

为什么Word里面。

Ctrl+Z。

可以撤销?


因为。

每操作一步。

都保存一次。


例如:

输入:

A B C

Stack:

C B A

点击:

撤销。

就是:

pop()

删除:

C。


又撤销。

删除:

B。

是不是很方便?


第十四幕 课堂实践二——浏览器返回

浏览器。

访问:

百度 新闻 天气 地图

请问:

点击:

返回。

去哪?


地图退出。

回:

天气。


再返回。

回:

新闻。


这就是:

Stack。


第十五幕 课堂实践三——字符串反转

输入:

hello

要求:

输出:

olleh

思路:

依次把每个字符压入栈。

h e l l o

然后不断:

top() pop()

输出:

olleh

参考程序:

#include<iostream> #include<stack> using namespace std; int main() { stack<char> st; string s; cin>>s; for(char c:s) { st.push(c); } while(!st.empty()) { cout<<st.top(); st.pop(); } return 0; }

输入:

hello

输出:

olleh

第十六幕 Stack真正的大本领——括号匹配

汉克老师展示:

(()()) ((())) (()(

问:

是否合法?


以后。

学习:

括号匹配。

全部要用:

Stack。

今天先认识下。

以后专门讲。


第十七幕 DFS也离不开Stack

我们学习:

深度优先搜索(DFS)。

虽然递归帮我们自动维护了"调用栈",

但如果不用递归,也可以自己写一个stack来完成搜索。

因此:

Stack 是很多算法的重要基础。


Queue 和 Stack 对比

Queue(队列)Stack(栈)
先进先出(FIFO)后进先出(LIFO)
两端操作只操作栈顶
front()看队首top()看栈顶
BFS 常用DFS、括号匹配、撤销操作常用

画图

Queue

进入 → 😀 😀 😀 → 离开

Stack

🍽 🍽 🍽 ↑ push ↓ pop

本课总结

今天,我们认识了Stack(栈)

它最大的特点就是:

后进先出(LIFO,Last In First Out)。


掌握了五个最常用的成员函数:

成员函数作用生活中的理解
push(x)压入栈顶放一个新盘子到最上面
pop()删除栈顶拿走最上面的盘子
top()查看栈顶看最上面的盘子
size()元素个数数一数盘子有多少个
empty()是否为空看盘子塔是否已经空了

一句话口诀

盘子高高往上放,后来盘子先离场;
push往上压,pop从上拿;
top看顶部,empty看有没有;
学会 Stack 不发愁,DFS、括号全都有!


"为什么递归像 Stack?"

我们同学,很多会递归,却不知道为什么会出现"函数调用栈"。

举例:

小明要完成任务A,但任务A需要先完成任务B;任务B又需要先完成任务C。

于是执行顺序变成:

开始A ↓ 开始B ↓ 开始C

C 完成后,再返回 B:

结束A ↑ 结束B ↑ 结束C

这和盘子一模一样:

  • 调用函数:不断push

  • 函数结束:不断pop

同学们,现在就更加理解什么是"压栈(push)"、什么是"出栈(pop)"。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 3:38:26

达林顿管在安防报警器驱动电路中的优势与应用

1. 项目背景与行业需求2026年安防报警器市场正迎来新一轮技术升级周期&#xff0c;蜂鸣器驱动电路作为报警系统的"声学引擎"&#xff0c;其可靠性直接关系到整个安防系统的有效性。在最近参与的某智慧社区项目中&#xff0c;我们实测发现传统MOSFET驱动方案在-20℃低…

作者头像 李华
网站建设 2026/7/21 3:38:18

华硕笔记本性能调校终极指南:用G-Helper告别臃肿控制软件

华硕笔记本性能调校终极指南&#xff1a;用G-Helper告别臃肿控制软件 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook,…

作者头像 李华
网站建设 2026/7/21 3:27:31

模板驱动的文档自动化:从Word填空到智能生成

1. 项目概述&#xff1a;用模板把文档生产变成“填空题”你有没有过这种体验&#xff1a;每周要交三份客户方案&#xff0c;每份结构雷同——封面、目录、痛点分析、解决方案、报价页、服务承诺——但每次都要从零新建Word、手动调格式、复制粘贴旧内容、反复检查页眉页脚是否错…

作者头像 李华
网站建设 2026/7/21 3:27:02

Dev-C++新手入门指南:从安装配置到Hello World实战

1. 项目概述&#xff1a;为什么Dev-C依然是新手入门的“老朋友”如果你刚刚踏入编程世界&#xff0c;尤其是C或C语言的大门&#xff0c;面对Visual Studio、CLion、VS Code这些功能强大但界面复杂、配置繁琐的“巨无霸”&#xff0c;是不是有点手足无措&#xff1f;别急&#x…

作者头像 李华
网站建设 2026/7/21 3:26:53

Proteus与ARM开发环境整合及SPI接口仿真实践

1. Proteus与ARM开发环境深度整合在嵌入式系统开发领域&#xff0c;硬件调试一直是耗时费力的环节。传统开发流程中&#xff0c;工程师需要经历原理图设计→PCB制板→焊接组装→硬件测试的完整周期&#xff0c;任何设计失误都会导致昂贵的返工成本。Proteus的出现彻底改变了这一…

作者头像 李华