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

后缀表达式求值:switch运行正常,if-else输出错误的原因?

后缀表达式求值代码问题解析

你在实现后缀表达式求值时遇到的问题,核心原因是独立if语句中的break会直接终止外层的for循环,导致表达式未完全处理;而switch语句中的break仅终止switch块,不会中断for循环的执行。

错误代码(多独立if版本)

public static int evaluatePostFix(String S) {
    Stack<Integer> s = new Stack<>();
    
    int n = S.length();
    
    for(int i = 0 ; i < n; i ++){
        char c = S.charAt(i);
        
        if(c >= '0' && c <= '9'){ // 处理操作数
            int temp = (int)(c - '0');
            s.push(temp);
        }else{ // 处理运算符
           int op1 = s.pop();
           int op2 = s.pop();
            
            if(c == '+'){
                s.push(op2 + op1);
                break; // 此处break会直接跳出外层for循环
            }
            if(c == '-'){
                s.push(op2 - op1);
                break; // 同上,触发后终止整个循环
            }
            if(c == '*'){
                s.push(op2 * op1);
                break;
            }
            if(c == '/'){
                s.push(op2 / op1);
                break;
            }
        }
    }
    
    return s.peek();
}

正确代码(switch版本)

switch(c){
    case '+':
        s.push(op2 + op1);
        break; // 仅跳出switch块,for循环继续执行
    case '-':
        s.push(op2 - op1);
        break;
    case '*':
        s.push(op2 * op1);
        break;    
    case '/':
        s.push(op2 / op1);
        break;
}

原因详解

  • 在多独立if的代码中,每个if分支里的break没有标签,会匹配到最近的循环结构(也就是外层的for循环)。这意味着只要遇到第一个运算符,执行完计算后就会直接终止整个for循环,后缀表达式中剩下的字符完全不会被处理,自然无法得到正确结果。
  • 而switch语句中的break作用范围仅局限于当前switch块,执行完对应运算符的计算后,break只会跳出switch,外层的for循环会继续迭代,处理表达式中的下一个字符,直到整个后缀表达式被完整计算。

内容的提问来源于stack exchange,提问作者jjp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:47:15