std::stack声明初始化默认用deque,可选vector或list;top()与pop()需分开安全调用;括号匹配须检查空栈和映射关系;它不支持遍历或随机访问。
怎么声明和初始化一个
直接用
就行,它默认底层容器是
,不用手动指定也能跑。但如果你有明确性能倾向(比如频繁头尾操作),得主动换容器。
最简写法:
—— 用
,通用稳妥
想用
(内存连续,缓存友好):
想用
(插入删除不挪动内存):
注意:不能写
这种错误组合,第二个模板参数必须是符合 Container 要求的类型(要有
、
、
等)。
和
为什么不能一起用
返回栈顶引用,
删除栈顶——但
不返回值。如果写成
,在空栈时会未定义行为;更危险的是有人误以为
后自动弹出,结果重复读、漏删。
安全读+删两步写法:
别写
无检查版本,CI 或 ASan 下容易崩
没有类似 Python 的
返回值接口,C++ 故意拆开,避免误用
用
实现括号匹配时要注意什么
这是典型使用场景,但新手常忽略字符类型匹配和边界处理。
立即学习
“
C++免费学习笔记(深入)
”;
C知道
CSDN推出的一款AI技术问答工具
下载
只压入左括号(
、
、
),遇到右括号才查栈顶是否匹配
每次
前必须
检查,否则非法访问
匹配逻辑别硬编码,用
存映射更清晰:
遍历完后栈必须为空才算合法,漏掉这步会把
判为正确
示例关键片段:
为什么不能用
遍历或随机访问
是容器适配器,不是容器——它故意屏蔽了迭代器和索引访问,只暴露 LIFO 接口。想遍历?说明你选错了工具。
需要遍历或查找:改用
或
,自己维护栈语义
需要调试时看内容:VS/LLDB 可以展开
(底层容器成员),但别依赖这个写业务逻辑
跨平台代码里别访问
,它不是标准接口,GCC 和 MSVC 实现名一致但属内部细节
真正需要“带遍历的栈”时,大概率是问题建模出了偏差,先确认是不是真要栈,还是只是需要后插前删的序列。
std::stackstd::stackstd::dequestd::stack s; dequevectorstd::stack> s; liststd::stack> s; std::stackpush_backpop_backbacktop()pop()top()pop()pop()s.pop(); auto x = s.top();top()if (!s.empty()) { int x = s.top(); s.pop(); /* use x */ }s.top(); s.pop();stack.pop()std::stack'(''{''['top()!s.empty()std::mapmapping[')'] = '('"((("if (s.empty() || s.top() != mapping[c]) return false;std::stackstd::stackstd::vectorstd::deques.cs.c