Превратить строку в математическое выражение?

Допустим, у меня есть метод, который объявлен таким образом:

public double Calc(String expression) {

// Code

}

Я хочу взять строковое выражение как

"2 + 4 - (3 * 4)"

Тогда накорми это Calc() и он должен вернуть значение, которое он получает.

Можете ли вы разобрать математическое выражение из строки, чтобы оно стало выражением, понятным Java? Потому что обычно ты можешь просто написать

return 2 + 4 - (3 * 4);

Но это будет работать только для этого единственного выражения.

2 ответа

Решение

Я бы предложил использовать алгоритм двух стеков Дейкстры.

Это должно быть в значительной степени то, что вам нужно:

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());
        }
    }
}

Не проверял это, но это должно быть примерно правильно.

Позвольте мне заявить, что в качестве ответа этот процесс может быть принят, как я думаю, хотя, просматривая пару вопросов по SO, вы должны получить четкое представление о том, как это сделать без загрузки JS-компилятора.

Для начала вам нужно проанализировать вашу строку с помощью функции, которая преобразует вашу математическую строку в инфиксную строку. Затем вы в основном оцениваете это выражение как другую функцию, разбивая строку в цикле, чтобы получить ответ. Красиво подробный процесс можно найти здесь.

Другие вопросы по тегам