Мне нужно создать два стека и оценить выражение инфикса, например 3 + 4 + (5 -2).Я создал код, делающий это с постфиксом, чтобы создать базу, так как это проще и работает безупречно!Теперь у меня проблема с круглыми скобками, я не знаю, как проверить, чтобы круглые скобки были сбалансированы, а затем, если они правильно оценивают выражение.Это должно быть что-то вроде:
Type a balanced infix expression: 5 * (4 + 3)
The result is 35
Type a balanced infix expression: 10 / (2 + 1
Not balanced, try again :
Вот тестер
import java.util.*;
public class InfixTester { //it's postfix at the moment
public static void main(String[] args) {
String expression, retry;
int result;
Scanner scan = new Scanner (System.in);
do {
InfixEvaluator evaluator = new InfixEvaluator(); //in reality is postfix rn
System.out.println ("Type a balanced postfix expression one token at a time:");
expression = scan.nextLine();
result = evaluator.evaluate(expression);
System.out.println();
System.err.println("The result is " + result);
System.out.print("Would you like to continue (y/n)? ");
retry = scan.nextLine();
System.out.println();
}
while (retry.equalsIgnoreCase("y"));
}
}
А вот оценщик, где все
import java.util.*;
public class InfixEvaluator { //it's actually postfix right now
private final static char ADD = '+';
private final static char SUBSTRACT = '-';
private final static char MULTIPLY = '*';
private final static char DIVIDE = '/';
private Stack <Integer> stack;
public InfixEvaluator() {
stack = new Stack <Integer>();
}
public int evaluate(String expr) {
int op1, op2, result = 0;
String token;
Scanner parser = new Scanner (expr);
while (parser.hasNext()) {
token = parser.next();
if (isOperator (token)) {
op2 = (stack.pop()).intValue();
op1 = (stack.pop()).intValue();
result = evaluateSingleOperator(token.charAt(0), op1, op2);
stack.push(new Integer (result));
}
else
stack.push(new Integer (Integer.parseInt (token)));
}
return result;
}
private boolean isOperator (String token){
return ( token.equals("+") || token.equals("-") ||
token.equals("*") || token.equals("/"));
}
private int evaluateSingleOperator(char operation, int op1, int op2){
int result = 0;
switch (operation){
case ADD:
result = op1 + op2;
break;
case SUBSTRACT:
result = op1 - op2;
break;
case MULTIPLY:
result = op1 * op2;
break;
case DIVIDE:
result = op1 / op2;
break;
}
return result;
}
}
Пока все это работает простохорошо для постфиксных выражений, что мне нужно изменить и добавить, чтобы вместо этого правильно оценить выражения инфикса?Спасибо!