用于评估表达式的Java算法

时间:2015-09-12 12:45:00

标签: java math stack expression

我正在尝试在java中实现这个伪代码来评估算术表达式。但我一直得到最后一位数:即如果我做1 + 2,我只得到2;我不知道我做错了什么,所以如果有人有任何想法,请告诉我!

Algorithm here

import java.util.Stack;

public class Main {

    static Stack<String> ops = new Stack<String>();
    static Stack<Double> vals = new Stack<Double>();

    private static void doOP() {
        double x = vals.pop();
        double y = vals.pop();
        String op = ops.pop();

        double v = 0;
        if (op.equals("+")) {
            v = y + x;
        } else {
            if (op.equals("-")) {
                v = y - x;
            } else {
                if (op.equals("*")) {
                    v = y * x;

                } else {
                    if (op.equals("/")) {
                        v = y / x;
                    }
                }
            }
        } 
        vals.push(v);
    }

    private static void repeatOps(String refOp) { 
        while ((vals.size() > 1) && (prec(refOp) <= prec(ops.peek()))) {
            doOP();
        } 
    }

    private static int prec(String refOp) {

        String[] bodmas = new String[] {  "(", ")", "/", "*", "+", "-", "$" };
        int i = 0;
        for (String operation : bodmas) {
            if (refOp.equals(operation)) {
                return i;
            }
            i++;
        }
        return -0;
    }

    private static boolean isNumber(String number) {
        try {
            @SuppressWarnings("unused")
            double d = Double.parseDouble(number);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    private static Double evalExp(String exp) {
        for (char z : exp.toCharArray()) {           
            if (isNumber(z + "")) {
                vals.push(Double.parseDouble(z + ""));
            } else {
                repeatOps(z + "");
                ops.push(z + "");
            }
        }
        repeatOps("$");
        return vals.peek();
    }

    public static void main(String[] args) {
        System.out.println(evalExp("3*2")); 
    }
}

1 个答案:

答案 0 :(得分:1)

您的prec()方法已被反转且不正确。

$最低优先级,即最低值,例如0

+-应该具有相同的优先权。

*/应该具有相同的优先权。

()不是二元运算符,无法使用所描述的逻辑进行处理。

因此,修复prec以返回0的{​​{1}},$1的{​​{1}}以及+的{​​{1}} -2