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

balancedBrackets函数异常:输入仅闭合括号时返回错误结果

括号平衡函数的问题修复

问题现象

这个判断括号字符串是否平衡的函数,在输入单个闭合括号(如)、]、})时,本该返回false,但实际返回了true。

原代码

function balancedBrackets(string) {
  let splited = string.split("");
  let stack = [];
  splited.forEach((x)=>{
    if(x=== '('|| x === '[' || x==='{'){
      stack.push(x)
    } else if( x=== ')'|| x === ']' || x==='}'){
     if((x === ')' && stack[stack.length - 1]!='(') || (x === ']' && stack[stack.length - 1]!='[') ||  (x === '{' && stack[stack.length - 1]!='}') || (stack.lenght===0)){
      return false
     }  else {
       stack.pop();
      }
    }
    
    });
  return stack.length === 0
}

问题分析

  1. forEach回调的return无法终止函数:forEach里的return false只会结束当前回调的执行,不会中断整个函数。即使检测到非法闭合括号,循环仍会继续,最后执行return stack.length === 0——单个闭合括号不会被压入栈,栈长度为0,所以返回true。
  2. 括号匹配条件错误:判断闭合括号}的条件写成了x === '{',逻辑完全颠倒。
  3. 拼写错误:stack.lenght应为stack.length,拼写错误导致这个条件永远不成立。
  4. 条件顺序不合理:先判断括号匹配再判断栈是否为空,栈空时访问stack[stack.length -1]会得到undefined,和括号比较会出现逻辑错误。

修复后的代码

function balancedBrackets(string) {
  let splited = string.split("");
  let stack = [];
  // 替换forEach为for...of,支持中途终止函数
  for (const x of splited) {
    if (x === '(' || x === '[' || x === '{') {
      stack.push(x);
    } else if (x === ')' || x === ']' || x === '}') {
      // 先判断栈是否为空,避免访问undefined
      if (stack.length === 0) {
        return false;
      }
      // 修正括号匹配条件
      const top = stack[stack.length - 1];
      if ((x === ')' && top !== '(') || 
          (x === ']' && top !== '[') || 
          (x === '}' && top !== '{')) {
        return false;
      }
      stack.pop();
    }
  }
  return stack.length === 0;
}

修复说明

  • 用for...of替代forEach,遇到非法情况时可以直接return false终止整个函数。
  • 调整判断顺序,先检查栈是否为空,避免访问不存在的栈顶元素。
  • 修正了}的匹配条件,以及length的拼写错误。
  • 提取栈顶元素到变量top,让代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者David Daniel Zambrano Corral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:55:20