C++怎么使用栈 C++中stack容器入栈出栈【基础】

6次阅读

C++怎么使用栈 C++中stack容器入栈出栈【基础】

怎么声明和初始化一个 std::stack

直接用 std::stack 模板,它默认底层用 deque,不用自己操心内存管理。最常见写法是:std::stack<int> s;</int>,也可以指定底层容器,比如 std::stack<int std::vector>> s;</int>——但除非有明确性能需求(比如需要连续内存),否则别动默认。

容易踩的坑:

  • std::stack 不是序列容器,不能用 begin()/end() 遍历,也不能用下标访问
  • 初始化时不能像 vector 那样传初始化列表(c++17 起部分编译器支持,但不通用),得一个个 push
  • 声明时没加 std:: 或忘了 #include <stack></stack>,报错通常是 ‘stack’ was not declared in this scope

pushpoptop 怎么配合用才不出错

push顶加元素,pop 删除顶元素(不返回值),top 返回栈顶引用(不删除)。三者必须配合使用,顺序错了就崩。

典型错误现象:

立即学习C++免费学习笔记(深入)”;

  • 对空栈调用 top()pop() → 未定义行为,运行时常崩溃或静默出错
  • pop() 当成“取并删”,结果写了 int x = s.pop(); → 编译不过,因为 pop() 返回 void
  • 想“查看后删除”,得写成两步:int x = s.top(); s.pop();

安全写法建议始终检查:if (!s.empty()) { int x = s.top(); s.pop(); }

为什么 stack 没有 size() 以外的遍历能力

这是设计使然。std::stack 是容器适配器(container adapter),只暴露 LIFO 接口,屏蔽了底层容器的随机访问能力。它不提供迭代器,也不允许你“看中间”。

使用场景决定是否该用它:

  • 做括号匹配、表达式求值、DFS 递归转迭代 → 适合,逻辑干净
  • 需要随时访问第 3 个元素、或者倒序打印全部内容 → 不适合,换 std::vectorstd::deque
  • 性能敏感且频繁入栈出栈 → 默认 deque 底层够快;若大量插入且内存局部性重要,可试 std::vector 底层,但要注意 pop 不释放内存

常见编译错误和运行时陷阱

几个高频报错直接对应具体操作:

  • Error: no matching function for call to ‘std::stack<int>::push(int&)’</int>变量类型和栈模板类型不一致,比如栈是 stack<string></string> 却 push 了 int
  • 程序崩溃在 top() → 几乎一定是没判 empty() 就调用了
  • 输出全是乱码或旧值 → 忘了 pop() 后还继续用 top() 的返回值,而该引用可能已失效(尤其底层是 vector 且触发了扩容)

调试时优先加一句 assert(!s.empty());top() / pop() 前,比靠运气强得多。

栈本身很简单,难的是时刻记得它不告诉你“里面还有多少”,也不让你回头翻——所有状态责任都在你代码里。

text=ZqhQzanResources