std::stack需用push逐个初始化,不支持花括号初始化;top()返回栈顶引用,pop()仅移除且返回void,须先empty()检查;无迭代器或find,因严格遵循LIFO设计。
std::stack
标准库的 std::stack 是容器适配器,不是独立容器,它默认底层用 std::deque 实现,也可以显式指定为 std::vector 或 std::list。不支持直接用花括号初始化(如 {1,2,3}),必须逐个 push。
std::stacks;
std::stack> s_vec;
std::vectorv = {1, 2, 3};
std::stacks;
for (int x : v) s.push(x); // 3 入栈后,栈顶是 3
push、top、pop 的正确调用顺序top() 返回栈顶元素的引用,但不移除;pop() 移除栈顶但不返回值 —— 这是初学者最容易出错的地方:不能写 s.pop().value 或 auto x = s.pop(),因为 pop() 返回 void。
if (!s.empty()) {
int x = s.top();
s.pop();
// 使用 x
}int x = s.pop(); // ❌ error: void value not ignored
top() 或 pop() 是未定义行为,务必先检查 empty()
std::stack 没有迭代器和 find?std::stack 是严
格 LIFO 接口封装,设计上就禁止随机访问或遍历。它只提供 top()、push()、pop()、size()、empty() 这 5 个成员函数。如果你需要查找、遍历、中间插入/删除,说明不该用 stack —— 改用 std::vector 或 std::deque 更合适。
pop + 临时存储,但会破坏原栈:std::stacktmp;
while (!s.empty()) {
std::cout << s.top() << " ";
tmp.push(s.top());
s.pop();
}
// 再把 tmp 倒回去(如果还要保留原数据)
push/pop 模拟遍历,时间复杂度 O(n),且容易逻辑翻转(栈是倒序的)std::stack 模板参数必须明确,不能依赖自动推导(C++17 也不支持 CTAD for stack),且底层容器类型必须满足特定要求(如支持 push_back、pop_back、back())。
std::stack s; // ❌ 缺少类型
std::stack> s; // ✅ 合法,但 list 不如 deque 默认高效
std::stack> s; // ❌ set 没有 back() 和 push_back()
stack 不重载 operator==,两个栈不能直接用 == 比较,得手动逐个 pop 对比std::stack 就很可靠;一旦开始想“能不能看第 3 个元素”或者“能不能在中间删一个”,就是接口误用的明确信号。