package algorithm.expression;
import datastructure.basic.Stack;
import java.util.EmptyStackException;
import java.util.List;
public class PrefixExpr {
private String expr;
private String splitRegex;
private Stack stack = new Stack();
public PrefixExpr(String expr) {
this.expr = expr;
this.splitRegex = " ";
}
public PrefixExpr(String expr, String splitRegex) {
this.expr = expr;
this.splitRegex = splitRegex;
}
public float evaluate() {
stack.clear();
List<Token> tokens = TokenParser.parse(expr, splitRegex);
try {
for (int i = tokens.size() - 1; i >= 0; --i) {
Token token = tokens.get(i);
if (token.isNumber()) {
stack.push(token);
} else {
Token num1 = (Token) stack.pop();
Token num2 = (Token) stack.pop();
Token result = Token.calculate(num1, token, num2);
stack.push(result);
}
}
} catch (EmptyStackException e) {
throw new RuntimeException("Wrong expression: " + expr);
}
if (stack.size() != 1) {
throw new RuntimeException("Wrong expression: " + expr);
}
return ((Token) stack.pop()).getFloatValue();
}
}