Stack
1. 标准库 std::stack (最常用)
头文件:#include <stack>
| 操作 | 代码 | 说明 | 注意 |
|---|---|---|---|
| 定义 | stack<int> s; |
定义一个整型栈 | |
| 入栈 | s.push(x); |
放入元素 x |
|
| 看顶 | x = s.top(); |
获取栈顶元素 | 不删除元素 |
| 出栈 | s.pop(); |
删除栈顶元素 | 返回 void (不返回值) |
| 判空 | s.empty() |
空返回 true |
常用于循环条件 |
| 大小 | s.size() |
返回元素个数 |
❌ 常见死法(Runtime Error):
- 合并调用:
int x = s.pop();(错误! C++ pop 无返回值)。
标准遍历模板:
while (!s.empty()) {
int top_val = s.top(); // 1. 先拿值
s.pop(); // 2. 再扔掉
// 处理 top_val...
}
2. 用 vector 模拟栈
std::stack 本质是容器适配器,常数稍大且不能遍历内部。竞赛中常用 vector 模拟,速度快且灵活。
| 栈操作 | Vector 等价写法 |
|---|---|
push(x) |
v.push_back(x) |
pop() |
v.pop_back() |
top() |
v.back() |
empty() |
v.empty() |
优势: 可以用 v[i] 访问栈底或中间元素(标准 stack 做不到)。
3. 手写数组模拟栈 (最快,防 TLE)
如果不使用 STL,这是性能天花板。
const int N = 100010;
int stk[N];
int tt = 0; // tt 代表栈顶指针
// 入栈
stk[++tt] = x;
// 出栈
tt--;
// 取栈顶
int top_val = stk[tt];
// 判空
if (tt > 0) { ... }
浙公网安备 33010602011771号