package com.coding.week6.exprNew;
import com.coding.weak1.Stack;
import java.util.List;
public class InfixExpr {
String expr = null;
public InfixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
Stack operatorStack = new Stack();
Stack numberStack = new Stack();
fillStack(numberStack, operatorStack);
while (!operatorStack.isEmpty()) {
Operator symbol = (Operator) operatorStack.pop();
float operTop1 = (float) numberStack.pop();
float operTop2 = (float) numberStack.pop();
numberStack.push(symbol.apply(operTop2, operTop1));
}
return (float)numberStack.pop();
}
public void fillStack(Stack numberStack, Stack operatorStack) {
TokenParser tokenParser = new TokenParser();
List<Token> tokens = tokenParser.parse(expr);
for (Token token : tokens) {
if (token.isNumber()) {
numberStack.push(token.getFloatValue());
}
else if (token.isOperator()) {
Operator o = token.getOperator();
if (operatorStack.isEmpty()) {
operatorStack.push(o);
}else {
Operator top = (Operator)operatorStack.peek();
if (o.hasHigherPriority(top)) {
operatorStack.push(o);
} else {
float operTop1 = (float) numberStack.pop();
float operTop2 = (float) numberStack.pop();
numberStack.push(top.apply(operTop2, operTop1));
operatorStack.pop();
operatorStack.push(o);
}
}
}
}
}
}