package expr;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PrefixExpr {
String expr = null;
public PrefixExpr(String expr) {
this.expr = expr;
}
public float evaluate() {
List<Token> tokenList = TokenParser.parse(expr);
tokenList = reverse(tokenList);
Stack<Token> operatorStack = new Stack<Token>();
Stack<Token> valueStack = new Stack<Token>();
for(int i = 0; i < tokenList.size(); i++){
Token token = tokenList.get(i);
if(token.isOperator()){
operatorStack.push(token);
popCompute(operatorStack, valueStack);
}else{
valueStack.push(token);
}
}
return valueStack.peek().getFloatValue();
}
public List<Token> reverse(List<Token> tokenList){
List<Token> newList = new ArrayList<Token>();
int size = tokenList.size();
for(int i = 0; i < size; i++){
newList.add(tokenList.get(size - 1 - i));
}
return newList;
}
// 计算加减乘除的结果
public float compute(float num1, float num2, String operator){
if(operator.equals("+")){
return num1 + num2;
}else if(operator.equals("-")){
return num1 - num2;
}else if(operator.equals("*")){
return num1 * num2;
}else{
return num1 / num2;
}
}
// 弹栈计算,取一个操作符和两个操作数进行计算,并将得到的操作数压入数值栈
// 注:在前缀表达式的计算中交换了第一个操作数和第二个操作数的位置,因为前缀表示式是从后向前遍历的
public void popCompute(Stack<Token> operatorStack, Stack<Token> valueStack){
float num2 = valueStack.pop().getFloatValue();
float num1 = valueStack.pop().getFloatValue();
String operator = operatorStack.pop().getOperator();
float value = compute(num2, num1, operator);//交换了操作数的位置
valueStack.push(new Token(1, String.valueOf(value)));
}
}