在java中评估后缀表达式

时间:2012-05-03 01:56:33

标签: java

我有一个问题我在这个函数中找不到错误它有时会对某些输入做得很好但有时没有检查这个输入“6 2/3 - 4 2 * +”可以任何一个帮助。

public static double Evaluating_postfix_expressions(String postfix) throws Exception{
    StringTokenizer st = new StringTokenizer(postfix);
    int numOF_tokens = st.countTokens();
    for (int i = 1; i <= numOF_tokens; i++) {
        Object term = st.nextToken();
        try { // if it is an operand there is no problem
            float x =  Float.parseFloat((String)term);
            stack.push(x);
        } catch (Exception e) { // it is an operator
            float v1 = (float) stack.pop();
            float v2 = (float) stack.pop();
            switch ((String) term) {
            case "+":
                stack.push(v2 + v1);
                break;
            case "-":
                stack.push(v2 - v1);
                break;
            case "*":
                stack.push(v2 * v1);
                break;
            case "/":
                stack.push(v2 / v1);
                break;
            }
        }
    }
    return (float) stack.pop();
}

1 个答案:

答案 0 :(得分:6)

请注意,您输入的操作符不正确:

6 2 / 3 – 4 2 * +

请注意与此处手动输入版本的区别:

6 2 / 3 - 4 2 * +

你使用了破折号而不是连字符 - 或者反之:

$ echo -n – | xxd
0000000: e280 93                                  ...
$ echo -n - | xxd
0000000: 2d                                       -
$ 

这是问题的一部分,这是一个不会报告任何问题的catch-all异常。您应该修改switch以报告无效的操作符,这样可以更容易地捕获此操作符。 (我碰巧认为看起来很有趣。)