后缀评估计算结果错误

postfix evaluation calculated result is wrong

提问人:ian 提问时间:11/30/2022 最后编辑:Federico klez Cullocaian 更新时间:11/30/2022 访问量:57

问:

我正在尝试使用堆栈实现后缀评估,但是计算后的结果不正确,我无法弄清楚是哪个部分的计算错误,非常感谢。

import java.util.Stack;

public class PostFixEvaluate {
    public static float calculate(Float operand_1,char operator,Float operand_2 ){
        switch(operator){
            case '+':
                return operand_2 + operand_1;

            case '-':
                return operand_2 - operand_1;

            case '*':
                return operand_2 * operand_1;

            case '/':
                return operand_2 / operand_1;
        }

        return 0;
    }   //end calculate()

    public static float postFixEvaluation(String expr){
        Stack<Float> stack = new Stack<>();
        int index = 0;

        while(index < expr.length()){
            char token = expr.charAt(index);
            boolean x = isOperand(token);

            if(x == true){     //operand
                float operandIn = (float)token;
                stack.push(operandIn);
            }
            else{           //operator
                float a = stack.pop();   //operand_1
                float b = stack.pop();   //operand_2
                char w = token;         //operator
                stack.push(calculate(a, w, b));
            }
            index += 1;
        }   //end while

        float result = stack.pop();
        return result;
     }  //postFixEvaluation()

    /*Operand or operator? operator return 1, operand return 2*/
     public static boolean isOperand(char c){
        switch(c){
            case '+':
            case '-':
            case '*':
            case '/':
                return false;   //an operator
            default:
                return true;   //an operand
        }   //end switch()
    }  //end isOperand()
}

输入后缀“312*+456*+97-/+”后,结果是3958.0,预计是22.0,这比错误多得多,但我仍然无法弄清楚为什么结果是3958.0。

Java 堆栈 后缀表示法

评论

1赞 Federico klez Culloca 11/30/2022
顺便说一句,可读性要强得多,而且不容易出错boolean x = isOperand(token);if(x == true){if(isOperand(token)){
1赞 user16320675 11/30/2022
用于将 A 转换为相应的数值Character.digit(token, 10)char
0赞 ian 12/1/2022
@user16320675 我使用您刚刚推荐的 Character.digit(char, radix) 将 CHAR 令牌转换为 FLOAT,但结果变成了 2.875,这仍然是错误的。我想知道问题是否发生在计算逻辑或 stack.pop() 逻辑上。
1赞 user16320675 12/1/2022
也许最好使用调试器......我使用复制和粘贴的代码得到 22.00 后包括 - 屏幕截图 ||但下面的答案应该是一样的digit(token, 10)
1赞 user16320675 12/1/2022
(对于通常的数字 0-9,您不能将我的解决方案与 Frederico 的答案之一混合在一起 - 任何一个都有效,但不能同时使用两者 - )digit(token, 10) == (token - '0')

答:

0赞 Federico klez Culloca 11/30/2022 #1

char token = expr.charAt(index);在第一次迭代中返回,但这是表示字符(即 51),而不是数字 3。'3'char'3'

要使用数字而不是表示该数字的字符,您可以通过从中减去“0”将其推入堆栈,如下所示:

stack.push(operandIn - '0');

评论

0赞 ian 12/1/2022
谢谢先生,我确实看到 GFG 上的有人添加了那一行,但是在我输入那行后,结果是 2.875,这仍然是错误的。
0赞 Federico klez Culloca 12/1/2022
奇怪的是,当我跑步时,我得到了 22.0