package algorithm.expression;
import datastructure.basic.Stack;
import java.util.ArrayList;
import java.util.List;
public class InfixExpr {
private Stack numbers = new Stack();
private Stack operators = new Stack();
private String expr;
public InfixExpr(String expr) {
this.expr = expr.replaceAll("\\s", "");
}
public float evaluate() {
numbers.clear();
operators.clear();
operators.push(Token.SCOPE);
List<Token> tokens = TokenParser.parse(expr);
tokens.add(Token.SCOPE);
for (int i = 0; i < tokens.size() && !operators.isEmpty(); ++i) {
Token token = tokens.get(i);
if (token.isNumber()) {
putNumber(token);
} else {
putOperator(token);
}
}
return numbers.isEmpty() ? 0 : ((Token) numbers.peek()).getFloatValue();
}
private void putNumber(Token num) {
numbers.push(num);
}
private void putOperator(Token op) {
int compare = Token.compare(op, (Token) operators.peek());
switch (compare) {
case 1:
operators.push(op);
break;
case 0:
operators.pop();
break;
case -1:
Token num1 = (Token) numbers.pop();
Token num2 = (Token) numbers.pop();
Token operator = (Token) operators.pop();
Token result = Token.calculate(num2, operator, num1);
numbers.push(result);
putOperator(op);
break;
}
}
}