package com.dudy.learn01.data_structure.queue.expr;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Stack;
public class PrefixExpr {
String expr = null;
public PrefixExpr(String expr) {
this.expr = expr;
}
/**
* 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),
* 并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
* 例如前缀表达式“- × + 3 4 5 6”:
* (1) 从右至左扫描,将6、5、4、3压入堆栈;
* (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;
* (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;
* (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
* 可以看出,用计算机计算前缀表达式的值是很容易的。
*
* @return
*/
public float evaluate() {
float result = 0;
TokenParser parser = new TokenParser();
List<Token> tokens = parser.parse(expr);
Stack<String> optStack = new Stack<>();
Stack<Float> numStack = new Stack<>();
for (int i = tokens.size() - 1; i >= 0; i--) {
Token token = tokens.get(i);
if (token.isNumber()) {
numStack.push(Float.parseFloat(token.value));
} else if (token.isOperator()) {
Float num1 = numStack.pop();
Float num2 = numStack.pop();
Float sum = calculator(num1, num2, token.value);
numStack.push(sum);
}
}
return numStack.pop();
}
private Float calculator(Float num1, Float num2, String op) {
Float res = 0.0f;
if ("*".equals(op)) {
res = num1 * num2;
} else if ("/".equals(op)) {
res = num1 / num2;
} else if ("-".equals(op)) {
res = num1 - num2;
} else if ("+".equals(op)) {
res = num1 + num2;
} else {
System.out.println("opt is not support...");
}
return res;
}
}