Превратить строку в математическое выражение?
Допустим, у меня есть метод, который объявлен таким образом:
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-компилятора.
Для начала вам нужно проанализировать вашу строку с помощью функции, которая преобразует вашу математическую строку в инфиксную строку. Затем вы в основном оцениваете это выражение как другую функцию, разбивая строку в цикле, чтобы получить ответ. Красиво подробный процесс можно найти здесь.