package com.coding.basic.homework_06.expr;
import java.util.List;
import java.util.Stack;
public class InfixExpr {
String expr = null;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
TokenParser parser = new TokenParser();
List<Token> tokens = parser.parse(expr);
Stack<Float> numStack = new Stack<Float>();
Stack<Token> opStack = new Stack<Token>();
for (Token token : tokens) {
if(token.isOperator()){
if(opStack.isEmpty()){
opStack.push(token);
}else{
while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){
Token prevOperator = opStack.pop();
Float float1 = numStack.pop();
Float float2 = numStack.pop();
Float result = getResult(float1, float2, prevOperator.toString());
numStack.push(result);
}
opStack.push(token);
}
}
if(token.isNumber()){
numStack.push(new Float(token.getIntValue()));
}
}
while(!opStack.isEmpty()){
Token prevOperator = opStack.pop();
Float float1 = numStack.pop();
Float float2 = numStack.pop();
Float result = getResult(float1, float2, prevOperator.toString());
numStack.push(result);
}
return numStack.pop();
}
private Float getResult(Float float1, Float float2, String operator){
if(operator.equals("+")){
return float1 + float2;
}else if(operator.equals("-")){
return float2 - float1;
}else if(operator.equals("*")){
return float1 * float2;
}else if(operator.equals("/")){
return float2 / float1;
}else{
throw new RuntimeException(operator + " is not supported");
}
}
}