栈是校验括号嵌套深度合法性的天然工具——它通过压入左括号、弹出匹配右括号来实时跟踪嵌套层次,栈空时弹出或遍历后非空即非法,且能识别类型错配与深度超限。

栈是校验括号嵌套深度合法性的天然工具——它不关心具体字符,只忠实记录“未匹配的左括号数量”和“嵌套层次变化”。核心逻辑很简单:遇到左括号就压入,遇到右括号就弹出;过程中若试图弹空栈,或最终栈非空,即为非法。
关键步骤:逐字符扫描 + 栈状态跟踪
不是简单计数,而是用栈模拟实际嵌套行为。每一对匹配的括号对应一次“入-出”操作,栈的高度(size)实时反映当前嵌套深度。
- 初始化一个空栈(可用
std::stack<char></char>或自定义动态数组栈) - 遍历字符串每个字符:
- 遇到
(、[、{等左括号,直接入栈 - 遇到
)、]、}等右括号:- 若栈为空 → 缺少对应左括号,立即返回非法
- 若栈顶与当前右括号不匹配(如栈顶是
[却遇到))→ 类型不匹配,非法 - 否则,弹出栈顶,继续
- 忽略非括号字符(如字母、数字、空格),仅关注括号本身
- 遇到
- 遍历结束后,检查栈是否为空:非空说明有左括号没被匹配,非法
深度限制校验:在入栈时加一层判断
如果需求不只是“合法”,还要控制最大嵌套层数(比如最多允许3层),只需在每次入栈前检查当前栈大小:
- 设最大深度为
max_depth = 3 - 每次准备 push 左括号前,执行
if (stack.size() >= max_depth) return false; - 这样当第4个左括号到来时,栈还没满到4,但 size 已为3,拒绝入栈,直接报错
为什么不用单纯计数器?
单纯用 int count++/-- 容易漏掉类型错配问题。例如 ([)]:计数器全程为0,看似平衡,但实际结构非法——中括号被圆括号“跨层”包裹。栈能保留括号类型顺序,确保 ) 只能匹配最近的 (,这才是真实嵌套语义。
常见边界情况处理
- 空字符串:栈初始为空,遍历结束仍为空 → 合法(深度为0)
-
纯右括号:如
)),首次 pop 就栈空 → 立即失败 -
深度超限但类型正确:如
((((,入第4个(前 size=3 → 触发深度限制,拒绝 -
混合括号嵌套:如
{[()]},栈依次存{ [ (,再逐个弹出 → 全匹配,合法











