You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode有效括号代码中if条件与pop()执行逻辑疑问

有效括号问题中pop()与判断逻辑的解析

核心背景回顾

有效括号问题的标准解法是用**栈(数组模拟)**实现:

  • 遇到左括号((/[/{)时,将其压入栈中
  • 遇到右括号()/]/})时,需要和栈顶的最近未匹配左括号做匹配
  • 全程只要出现不匹配、栈空却遇到右括号、遍历结束栈不为空的情况,都直接返回false

针对if(s[i] !== newBrackets.pop()){return false;}的拆解

1. newBrackets.pop()的双重作用

JavaScript的Array.pop()方法不是单纯的“读取栈顶元素”,它会同时完成两件事:

  • 移除数组的最后一个元素(直接修改原数组)
  • 返回被移除的那个元素

这里的pop()既完成了“取出最近的左括号”的操作,同时也把这个已经完成匹配校验的左括号从栈里清除,避免干扰后续的匹配逻辑。

2. if条件与return false的执行逻辑

这条语句的完整逻辑是:

取出栈顶的左括号 → 对比当前右括号s[i]和这个左括号是否不匹配 → 只要不匹配(或者栈为空导致pop()返回undefined),直接判定整个字符串为无效括号,返回false

分两种关键场景理解:

  • 场景1:括号类型不匹配
    比如字符串是"([)]",遍历到第三个字符)时:
    栈当前是['(', '['],pop()取出[,然后判断) !== [ → 条件成立,直接返回false,正确识别无效组合。
  • 场景2:右括号数量多于左括号
    比如字符串是")()",遍历到第一个字符)时:
    栈是空的,pop()返回undefined,判断) !== undefined → 条件成立,返回false,避免后续无意义的遍历。

如果条件不成立(也就是括号匹配成功),则不会执行return false,代码继续遍历下一个字符,栈也已经移除了匹配成功的左括号,等待下一次匹配。


完整代码逻辑示例(补充上下文)

通常这段代码会包裹在switch语句里,完整结构大概是这样:

function isValid(s) {
    const newBrackets = [];
    for(let i = 0; i < s.length; i++){
        switch(s[i]){
            case '(':
                newBrackets.push(')');
                break;
            case '[':
                newBrackets.push(']');
                break;
            case '{':
                newBrackets.push('}');
                break;
            default:
                // 处理右括号的分支
                if(s[i] !== newBrackets.pop()){
                    return false;
                }
        }
    }
    // 遍历结束后栈必须为空,否则左括号数量多于右括号
    return newBrackets.length === 0;
}

这里的实现是压入左括号对应的右括号,匹配时直接对比当前右括号和栈顶元素,和“压入左括号,匹配时判断右括号对应左括号是否等于栈顶”的逻辑完全一致。

内容的提问来源于stack exchange,提问作者h4ck1ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:07:24