9

假设我有一个这样声明的方法:

public double Calc(String expression) {

// Code

}

我想采用类似的字符串表达式

"2 + 4 - (3 * 4)"

然后将其提供给它Calc(),它应该返回它获得的值。

你能从一个字符串中解析出一个数学表达式,使它成为一个Java可以理解的表达式吗?因为通常你可以写

return 2 + 4 - (3 * 4);

但这仅适用于那个单一的表达式。

4

2 回答 2

7

我建议使用 Dijkstra 的 twostack 算法。

这应该是您所需要的:

public class DijkstraTwoStack {
    public static void main(String[] args) {
                Scanner scanner = new Scanner(System.in);
                String exp[] = scanner.nextLine().split(" ");
        Stack<String> ops = new Stack<String>();
        Stack<Double> vals = new Stack<Double>();

        for(int i = 0; i < exp.length; i++) {
                        String s = exp[i];
            if (s.equals("(")) {
            }
            else if (s.equals("+") || s.equals("*")) {
                ops.push(s);
            } else if (s.equals(")")) {
                getComp(ops, vals);
            } else {
                vals.push(Double.parseDouble(s));
            }
        }
        getComp(ops, vals);
        System.out.println(vals.pop());
    }

    private static void getComp(Stack<String> ops, Stack<Double> vals) {
        String op = ops.pop();
        if (op.equals("+")) {
            vals.push(vals.pop() + vals.pop());
        } else if (op.equals("*")) {
            vals.push(vals.pop() * vals.pop());
        }
    }
}

没测试过,但应该是对的。

于 2013-02-26T10:08:47.007 回答
0

让我声明这是一个可以采用的过程,因为我认为虽然浏览了一些关于 SO 的问题,但您应该对如何在不加载 JS 编译器的情况下做到这一点有一个公平的想法。

对于初学者,您需要通过将数学字符串转换为中缀字符串的函数来解析字符串。然后,您基本上通过在循环中分解字符串以返回您的答案来将此表达式评估为另一个函数。可以在这里找到一个精美详细的过程。

于 2013-02-26T09:28:59.913 回答