女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩把红盘、蓝盘、黄盘依次叠起来。要拿盘子时,只从最上面拿。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 放红盘底部
  2. 放蓝盘红盘上方
  3. 放黄盘栈顶
  4. 取出顺序黄、蓝、红

栈按后进先出的规则操作。

入栈把元素放到顶部,出栈取走顶部。函数调用、括号匹配等问题都能用到这种顺序。

最后放入的先取出

从左到右表示栈底到栈顶,最右边是可以取出的元素。

第 1 步 · 放入红盘
红盘

红盘是当前栈顶。

第 2 步 · 放入蓝盘
红盘蓝盘

蓝盘成为新的栈顶。

第 3 步 · 放入黄盘
红盘蓝盘黄盘

最后放入黄盘,所以先取黄盘。

第 4 步 · 取出一个
红盘蓝盘

黄盘已取走,现在轮到蓝盘位于栈顶。

01什么是栈?

栈(Stack)是一种只在同一端进行主要插入和删除的数据结构。

这一端叫栈顶(top)

02为什么像一摞盘子?

盘子 C ← 最上面盘子 B盘子 A

最后放上去的盘子 C,会最先被拿走。

后进先出(LIFO)

03push、pop、top 是什么?

push

把新元素压到栈顶。

pop

移除栈顶元素。

top

查看当前栈顶元素。

04栈是怎样变化的?

空栈→ push AA→ push BB / A→ popA

每次只从栈顶进出。

05栈能解决什么问题?

  • 函数调用栈
  • 撤销操作
  • 括号匹配
  • 表达式处理
  • DFS 的某些实现

06C++ 里怎样使用栈?

#include <stack>

std::stack<int> s;
s.push(10);
s.push(20);

std::cout << s.top(); // 20
s.pop();

pop() 只移除元素,不返回被移除的值,因此如果要使用它,通常先 top()pop()

07栈一定是连续内存吗?

不一定。

std::stack 是一种容器适配器,默认通常使用 std::deque 作为底层容器,也可以使用其他满足要求的容器。

你已经知道了什么

  • 栈遵循后进先出。
  • 主要操作发生在栈顶。
  • push 压入,pop 移除,top 查看栈顶。
  • 栈适合表达“最近加入的先处理”。
  • 栈的逻辑模型不等于具体内存布局。

下一篇:队列:像排队买票

轮到你来试一试

依次放入 1、2,再取出一个,取到谁?

想好了吗?点开看解释

2。它最后进入,位于栈顶;取走后 1 才成为栈顶。