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

Java后缀表达式求值方法异常:结果与预期不符求助

问题根源与修复方案

嘿,我一眼就揪出问题所在啦!你得到2849这个离谱结果的核心原因,是把字符形式的数字直接压入栈时,存的是它们的ASCII码值,而不是实际的数字值。

为啥会算出2849?咱们走一遍错误流程:

数字字符的ASCII码是这样的:'9'=57、'2'=50、'3'=51、'4'=52,你的代码执行过程是:

  • 遍历到'9'和'2',直接push它们的ASCII码57、50
  • 遇到*:弹出50和57,计算57*50=2850,push2850
  • 遇到'3':push51;遇到+:弹出51和2850,计算2850+51=2901,push2901
  • 遇到'4':push52;遇到-:弹出52和2901,计算2901-52=2849——这就是你看到的错误结果!

修复方法:把字符转成实际数字再压栈

只需要修改数字入栈的那一行,把字符转成对应的整数,有两种简单实现方式:

  1. 使用Character.getNumericValue(c)方法直接转换
  2. 利用数字字符ASCII码的连续性,用c - '0'计算(比如'9'-'0'=9)

修复后的完整代码片段

public static int postFixEvaluator(String s){
    NewStack stack = new NewStack();
    for(int i=0; i<s.length(); i++){
        char c = s.charAt(i);
        if(Character.isDigit(c)){
            // 核心修复:将字符数字转为实际整数再入栈
            stack.push(Character.getNumericValue(c));
            // 也可以替换成:stack.push(c - '0'); 效果完全一致
        } else {
            int y = stack.pop();
            int x = stack.pop();
            int z = 0;
            // 用switch更清晰处理不同运算符
            switch(c){
                case '+':
                    z = x + y;
                    break;
                case '-':
                    z = x - y;
                    break;
                case '*':
                    z = x * y;
                    break;
                case '/':
                    // 额外提醒:这里可以加个除零判断,避免运行时异常
                    z = x / y;
                    break;
            }
            stack.push(z);
        }
    }
    return stack.pop();
}

验证修复效果

现在再运行输入"92*3+4-",执行流程就完全正确了:

  • push9、push2 → 遇到*计算9*2=18,push18
  • push3 → 遇到+计算18+3=21,push21
  • push4 → 遇到-计算21-4=17,最终返回17,和手动计算结果一致!

最后小提醒:如果你的NewStack是自定义栈类,要确保它的push和pop方法能正确处理int类型(比如内部存储的是Integer或int数组),避免类型转换的坑~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:24:06