Java栈式括号验证器为何在嵌套表达式场景下验证失败?
括号验证器错误匹配
([)]的问题修复 你的代码核心问题在于:遇到闭合括号与栈顶元素不匹配时,没有触发失败逻辑,导致错误的嵌套表达式最终通过了栈空的校验。
以([)]为例,执行流程是这样的:
- 遍历到
(,入栈;遍历到[,入栈,此时栈内容为[ '(', '[' ] - 遍历到
),弹出栈顶的[,三个匹配判断都不满足,但代码没有任何处理,直接继续循环 - 遍历到
],弹出栈顶的(,同样匹配判断不满足,仍继续循环 - 循环结束后栈为空,错误返回
true
修复方案
在闭合括号的处理逻辑中,只要发现弹出的栈顶元素与当前闭合括号不匹配,直接返回false即可。同时把第二个if改为else if,避免逻辑上的冗余(一个字符不可能既是左括号又是右括号)。
修复后的代码:
import java.util.Stack; public class Validator { public static boolean isBalanced(String expression) { Stack<Character> stack = new Stack<>(); for (char c : expression.toCharArray()) { if (c == '(' || c == '{' || c == '[') { stack.push(c); } else if (c == ')' || c == '}' || c == ']') { if (stack.isEmpty()) { return false; } char top = stack.pop(); // 不匹配直接返回false if (c == ')' && top != '(') { return false; } if (c == '}' && top != '{') { return false; } if (c == ']' && top != '[') { return false; } // 匹配则继续循环 } // 非括号字符直接忽略 } return stack.isEmpty(); } public static void main(String[] args) { System.out.println(isBalanced("([)]")); // 现在输出false } }
简化写法(可选)
也可以把匹配判断合并成一个条件,逻辑更紧凑:
// 替换原有的匹配判断部分 char top = stack.pop(); if (!((c == ')' && top == '(') || (c == '}' && top == '{') || (c == ']' && top == '['))) { return false; }
内容的提问来源于stack exchange,提问作者Brueda-07
相关产品推荐
相关产品推荐

