package expr; import stack.MyStack; import java.util.List; /** * Created by gongxun on 2017/4/22. * 从后向前遍历入栈 */ public class PrefixExpr { String expr = null; public PrefixExpr(String expr) { this.expr = expr; } public float evaluate() { TokenParser tokenParser = new TokenParser(); if (expr == null) throw new RuntimeException("wrong expr !"); MyStack<Float> stack = new MyStack<Float>(); List<Token> tokens = tokenParser.parse(expr); for (int i = tokens.size() - 1; i >= 0; i--) { Token token = tokens.get(i); if (token.isNumber()) stack.push(((Integer) token.getIntValue()).floatValue()); else { Float value = calcValue(stack, token.toString()); stack.push(value); } } return stack.pop(); } private Float calcValue(MyStack<Float> stack, String operator) { Float leftNum = stack.pop(); Float rightNum = stack.pop(); if (operator.equals("+")) return leftNum + rightNum; else if (operator.equals("-")) return leftNum - rightNum; else if (operator.equals("*")) return leftNum * rightNum; return leftNum / rightNum; } }