package com.coding.basic.stack.expr; import java.util.List; import java.util.Stack; import com.sun.org.apache.xpath.internal.compiler.OpCodes; public class InfixExpr { String expr=null; public InfixExpr(String expr) { this.expr=expr; } //5-2+3 6/2*3 5-2+3*4 2+3-5 public float evaluate() { TokenParser tokenParser=new TokenParser(); List<Token> tokens= tokenParser.parse(expr); Stack<Token> opStack=new Stack<>(); Stack<Float> numStack=new Stack<>(); for (Token token : tokens) { if (token.isNumber()) { numStack.push((float)(token.getIntValue())); } else { while (!opStack.isEmpty()&&!token.hasHigherPriority(opStack.peek())) { float op2=numStack.pop(); float op1= numStack.pop(); char op=opStack.pop().toString().charAt(0); numStack.add(caculate(op1,op2,op)); } opStack.push(token); } } while (opStack.size()!=0) { float op2=numStack.pop(); float op1= numStack.pop(); char op=opStack.pop().toString().charAt(0); numStack.add(caculate(op1,op2,op)); } return (float) numStack.pop(); } public float caculate(float op1,float op2,char op){ float tmpResult = 0; switch(op){ case '+': tmpResult = op1 + op2; break; case '-': tmpResult = op1 - op2; break; case '*': tmpResult = op1 * op2; break; case '/': tmpResult = op1 / op2; break; } return tmpResult; } }