数组与线性结构

栈是一种你只能碰到顶部的集合,就像一摞盘子:新盘子放在顶上,要拿也只能拿最上面那个。最后进去的最先出来——这叫做 LIFO,后进先出。两个核心动作是 push(压入顶部)和 pop(弹出顶部);peek 则只看顶部而不取走。

因为所有操作都集中在一端,栈很便宜:push 和 pop 都是 O(1)。你可以用动态数组实现它(push 即追加、pop 即删末尾),也可以用链表(在头部 push/pop)。C++ 提供了现成的封装 std::stack。它故意没有快速触及中间的办法——这个限制正是要点,它让结构保持简单而快速。

留意之后你会发现栈无处不在。调用栈记录着谁调用了谁、以及如何返回;撤销历史会弹出最近一次操作;括号匹配、表达式求值,以及深度优先搜索中的回溯,都靠一个栈来记住该回到哪里。

#include <stack>
std::stack<int> s;
s.push(1); s.push(2); s.push(3);
//  top -> | 3 |
//         | 2 |
//         | 1 |   (bottom)
int t = s.top();   // 3   (peek, O(1))
s.pop();           // removes 3, O(1)
// now top() == 2

LIFO 顺序;push 与 pop 都是 O(1)。

作为数据结构的栈,与运行程序的调用栈不是一回事——但调用栈本身就是一个栈,名字因此共用。

又称
LIFOLIFO stack堆栈堆疊後進先出