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

自定义Stack入栈异常导致括号匹配判断出错问题求助

问题分析与修复

原代码的核心错误

  1. 循环弹出次数错误:第二个循环执行expr.length()次,而两个栈的元素总数最多等于表达式长度(仅当全为括号时),每个栈的元素数是总长度的一半。循环次数超出栈的元素数量,导致多次尝试弹出空栈,触发提示。
  2. 未校验括号匹配顺序:仅通过最终栈是否为空判断,无法识别())((这类括号数量相等但顺序完全错误的不平衡场景。
  3. 未处理非括号字符:输入包含其他字符时,原代码会忽略,可能导致错误的平衡判断。

修改后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:20:35