package basic.dataStructure.stack.expr; import basic.dataStructure.stack.Stack; import java.util.List; public class InfixExpr { String expr = null; public InfixExpr(String expr) { this.expr = expr; } public float evaluate() { List<Token> tokens = TokenParser.parse(expr); Stack numbers = new Stack(); Stack operators = new Stack(); int temp = 0; for (Token token : tokens) { if (token.isOperator()) { operators.push(token); } if (token.isNumber()) { numbers.push(token); } //先计算 int opeSize = operators.size(); int numSize = numbers.size(); float val1 = ((Token) numbers.pop()).getFloatValue(); float val2 = ((Token) numbers.pop()).getFloatValue(); if (numSize == 3 && opeSize == 2) { Token tmp = (Token) operators.pop(); if (tmp.hasHigherPriority((Token) operators.peek())) { //如果1+2*3,先计算numbers后两位 numbers.push(new Token(Token.NUMBER, Calculator.getFloat(val1, val2, tmp.toString()) + "")); } else { //如果1*2+3,先计算numbers栈前两位 //先保存数字和运算符 Token sNum = (Token) numbers.pop(); Token sOper = tmp; //需要进行计算的运算符 Token oper = (Token) operators.pop(); numbers.push(new Token(Token.NUMBER, Calculator.getFloat(val1, val2, oper.toString()) + "")); numbers.push(new Token(Token.NUMBER, sNum + "")); operators.push(new Token(Token.OPERATOR, sOper.toString())); } } } if (numbers.size() == 2 && operators.size() == 1) { float val1 = ((Token) numbers.pop()).getFloatValue(); float val2 = ((Token) numbers.pop()).getFloatValue(); return Calculator.getFloat(val1, val2, (operators.pop()).toString()); } else { throw new RuntimeException("last calculation exception, numbers.size=" + numbers.size() + ", operators.size=" + operators.size()); } } }