package week07.basic;
import java.util.List;
import java.util.Stack;
public class PrefixExpr {
private String expr = null;
public PrefixExpr(String expr) {
this.expr = expr;
}
/**
* 计算
* @param operator 运算符
* @param i1 操作数1
* @param i2 操作数2
* @return
*/
private int cal(char operator, int i1, int i2){
int result = 0;
switch(operator){
case '+' : result = i1 + i2 ; break;
case '-' : result = i1 - i2 ; break;
case '*' : result = i1 * i2 ; break;
case '/' :
if(i1 == 0){
throw new ArithmeticException("除数不能为0");
}
result = i1 / i2 ; break;
}
return result;
}
public float evaluate() {
TokenParser tokenParser = new TokenParser();
List<Token> tokens = tokenParser.parse(expr);
Stack<Integer> numStack = new Stack<>();
for(int i = tokens.size() - 1; i >= 0;i--){
Token token = tokens.get(i);
if(token.isNumber()){
numStack.push(token.getIntValue());
}else if(token.isOperator()){
int n1 = numStack.pop();
int n2 = numStack.pop();
numStack.push(cal(token.value.charAt(0), n1, n2));
}
}
return (float)numStack.pop() ;
}
}