自定义Stack入栈异常导致括号匹配判断出错问题求助
问题分析与修复
原代码的核心错误
- 循环弹出次数错误:第二个循环执行
expr.length()次,而两个栈的元素总数最多等于表达式长度(仅当全为括号时),每个栈的元素数是总长度的一半。循环次数超出栈的元素数量,导致多次尝试弹出空栈,触发提示。 - 未校验括号匹配顺序:仅通过最终栈是否为空判断,无法识别
())((这类括号数量相等但顺序完全错误的不平衡场景。 - 未处理非括号字符:输入包含其他字符时,原代码会忽略,可能导致错误的平衡判断。
修改后的isBalanced方法
正确的括号平衡校验应该使用单栈逻辑:遇到左括号入栈,遇到右括号则弹出栈顶的左括号(若栈为空则直接判定不平衡),最后栈为空则说明所有括号匹配正确。
static boolean isBalanced(String expr){ // 基础判断:空字符串或长度为奇数直接返回不平衡 if (expr == null || expr.length() % 2 == 1) { return false; } Stack stack = new Stack(); // 遍历表达式每个字符 for (int i = 0; i < expr.length(); i++){ char currentChar = expr.charAt(i); // 左括号入栈 if (currentChar == '(') { stack.push(currentChar); } // 右括号处理 else if (currentChar == ')') { // 栈为空说明没有对应的左括号,直接返回false if (stack.isEmpty()) { return false; } // 弹出对应的左括号 stack.pop(); } // 遇到非括号字符,直接判定不平衡 else { return false; } } // 最终栈为空则所有括号匹配成功 return stack.isEmpty(); }
修复说明
- 移除了多余的第二个栈,用单栈即可完成顺序校验。
- 遍历过程中实时校验:遇到右括号时若栈为空,说明存在无匹配的右括号,直接返回
false。 - 新增非括号字符的处理,避免无效输入干扰判断。
- 最终通过栈是否为空确认所有左括号都有对应的右括号匹配。
内容的提问来源于stack exchange,提问作者pokemonmater940
相关产品推荐
相关产品推荐

