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 }
问题分析
forEach回调的return无法终止函数:forEach里的return false只会结束当前回调的执行,不会中断整个函数。即使检测到非法闭合括号,循环仍会继续,最后执行return stack.length === 0——单个闭合括号不会被压入栈,栈长度为0,所以返回true。- 括号匹配条件错误:判断闭合括号
}的条件写成了x === '{',逻辑完全颠倒。 - 拼写错误:
stack.lenght应为stack.length,拼写错误导致这个条件永远不成立。 - 条件顺序不合理:先判断括号匹配再判断栈是否为空,栈空时访问
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
相关产品推荐
相关产品推荐

