如何打印在Java中作为String输入的等式的解

时间:2016-10-23 04:41:56

标签: java string

如何输入字符串,例如:     " 1 + 2/3 * 2" 输出为2.333

基本上我想输入一个数学方程式的字符串,并使用BODMAS输出答案。 我已经尝试将字符串分成一系列操作数和一组操作符,但是我无法执行BODMAS部分。

3 个答案:

答案 0 :(得分:0)

您可以使用堆栈来评估表达式,使用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());
        }
    }
}

答案 1 :(得分:0)

这听起来像是一个家庭作业问题但是。 将其分解为操作数和运算符是一个良好的开端。但是你需要保持他们在等式中的位置的良好记录。 下一步将遍历您的BOMDAS以分别执行每个步骤。

因此,如果您看到括号首先执行该部分,请搜索​​您的操作数,但是请注意括号,这将需要重新开始BOMDAS评估。所以也许在递归函数中实现它可能是强大的。 接下来搜索乘法。如果你找到一个多个两边的两个操作数。这将导致现有两个运算符之间出现新的操作数。

继续遍历BOMDAS的每个元素,确保在执行操作时,将使用新操作数代替现有的两个操作数和运算符。

答案 2 :(得分:0)