package task7.expr; import task5.stack.Stack; import java.util.List; public class PrefixExpr { private String expr; private Stack<Float> numberStack = new Stack<>(); public PrefixExpr(String expr) { this.expr = expr; } public float evaluate() { List<Token> parse = new TokenParser().parse(expr); for (int i = parse.size() - 1; i >= 0; i--) { Token token = parse.get(i); // 前缀表达式:从右向左遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 if (token.isNumber()) numberStack.push((float) token.getIntValue()); else numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); } /*while (!operatorStack.isEmpty()) { numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); }*/ return numberStack.peek(); } private static float cal(String operator, float var1, float var2) { switch (operator) { case "+": return var1 + var2; case "-": return var1 - var2; case "*": return var1 * var2; case "/": return var1 / var2; } return -1; } }