package com.ralf.stack.expr; import java.util.List; import com.ralf.stack.MyStack; public class InfixExpr { private String exprString; public InfixExpr(String exprString) { this.exprString = exprString; } public double evaluate() { MyStack<Float> numStack = new MyStack<Float>(); MyStack<Token> operStack = new MyStack<>(); TokenParser parser = new TokenParser(); List<Token> list = parser.parse(exprString); for (Token token : list) { if (token.isOperator()) { if (operStack.isEmpty()) { operStack.push(token); } else { while (!operStack.isEmpty() && !token.hasHigherPriority(operStack.peek())) { String operator = operStack.pop().toString(); Float num1 = numStack.pop(); Float num2 = numStack.pop(); Float result = operate(operator,num1,num2); numStack.push(result); } operStack.push(token); } } if (token.isNumber()) { numStack.push(new Float(token.getValue())); } } while(!operStack.isEmpty()){ String operator = operStack.pop().toString(); Float num1 = numStack.pop(); Float num2 = numStack.pop(); Float result = operate(operator,num1,num2); numStack.push(result); } return numStack.pop().floatValue(); } private Float operate(String operator,Float num1, Float num2) { float result = 0.0f; switch (operator) { case "+": result = num2 + num1; break; case "-": result = num2 - num1; break; case "*": result = num2 * num1; break; case "/": result = num2 / num1; break; } return result; } }