为什么我用Java实现的基于栈的括号校验器在处理嵌套表达式时会失败?

编程语言 2026-07-09

我在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章