为什么我用Java实现的基于栈的括号校验器在处理嵌套表达式时会失败?
我在Java中用一个栈实现一个简单的括号校验器。目标是验证一个表达式中是否包含成对的括号、方括号和花括号。这个校验器对一些简单表达式工作正常,但在某些嵌套组合上的判断却不正确。
示例输入(应返回 false):
([)]
我当前的实现返回 true:
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);
}
if (c == ')' || c == '}' || c == ']') {
if (stack.isEmpty()) {
return false;
}
char top = stack.pop();
if (c == ')' && top == '(') {
continue;
}
if (c == '}' && top == '{') {
continue;
}
if (c == ']' && top == '[') {
continue;
}
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
System.out.println(isBalanced("([)]"));
}
}
我已经检查了:
- 栈的入栈/出栈逻辑
- 循环遍历
- 嵌套括号处理
然而,我仍然不明白为什么这个无效的嵌套表达式会被视为平衡的。
是不是还缺少对不匹配闭括号的额外校验步骤?
解决方案
你不会在关闭括号与栈顶不匹配时返回false。任何 if (c == ')' && top == '(') 的检查都没有通过,但那没关系,循环仍然继续。
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);
}
if (c == ')' || c == '}' || c == ']') {
if (stack.isEmpty()) {
return false;
}
char top = stack.pop();
if (c == ')' && top == '(') {
continue;
}
if (c == '}' && top == '{') {
continue;
}
if (c == ']' && top == '[') {
continue;
}
return false; // <- What you were missing
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
System.out.println(isBalanced("([)]"));
}
}
为了方便你日后调试,你说希望它对你的输入返回false。
但你以为是哪条代码路径会返回false?你的代码只有在遇到闭括号且栈为空时才返回false,或者在结束时栈不为空时才返回false。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。