You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java栈式括号验证器为何在嵌套表达式场景下验证失败?

括号验证器错误匹配([)]的问题修复

你的代码核心问题在于:遇到闭合括号与栈顶元素不匹配时,没有触发失败逻辑,导致错误的嵌套表达式最终通过了栈空的校验。

以([)]为例,执行流程是这样的:

  1. 遍历到(,入栈;遍历到[,入栈,此时栈内容为[ '(', '[' ]
  2. 遍历到),弹出栈顶的[,三个匹配判断都不满足,但代码没有任何处理,直接继续循环
  3. 遍历到],弹出栈顶的(,同样匹配判断不满足,仍继续循环
  4. 循环结束后栈为空,错误返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:27:27