package datastructure.stack.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 tokenParser = new TokenParser(expr);
List<Token> tokenList = tokenParser.parse();
Stack<Token> operaStack = new Stack<>();
Stack<Float> floatStack = new Stack<>();
for (int i = 0; i < tokenList.size(); i++) {
if (Token.OPERATOR.equals(tokenList.get(i).getType())) {
if (operaStack.isEmpty()) {
operaStack.push(tokenList.get(i));
} else {
Token topToken = operaStack.peek();
if (tokenList.get(i).comparePriority(topToken) > 0) {
operaStack.push(tokenList.get(i));
} else {
float result = stackTopCalculate(operaStack, floatStack);
floatStack.push(result);
i--;
}
}
} else {
floatStack.push(Float.valueOf(tokenList.get(i).getValue()));
}
}
while (!operaStack.empty()) {
float temp = stackTopCalculate(operaStack, floatStack);
floatStack.push(temp);
}
return floatStack.pop();
}
private float stackTopCalculate(Stack<Token> operaStack, Stack<Float> floatStack) {
String operator = operaStack.pop().getValue();
float num2 = floatStack.pop();
float num1 = floatStack.pop();
float result = calculate(operator, num1, num2);
return result;
}
private float calculate(String operator, float num1, float num2) {
float result = 0;
switch (operator.charAt(0)) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
throw new IllegalArgumentException();
}
return result;
}
}