package org.xukai.coderising.stack; import java.util.List; import java.util.Stack; /** * 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 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,由此得出最终结果。 可以看出,用计算机计算前缀表达式的值是很容易的。 * @author xukai * @desc * @date 2017-04-22-13:49 */ public class PrefixExpr { private String expr; public PrefixExpr(String expr) { this.expr = expr; } public float evaluate(){ TokenParser tokenParser = new TokenParser(); List<Token> tokens = tokenParser.parse(expr); Stack<Float> numStack = new Stack(); Stack<Float> oprStack = new Stack(); for (int i = tokens.size() - 1; i > -1; i--) { if (tokens.get(i).isNumber()) { numStack.push(new Float(tokens.get(i).getIntValue())); } else { Float num1 = numStack.pop(); Float num2 = numStack.pop(); numStack.push(caculate(tokens.get(i).toString(), num1, num2)); } } return numStack.pop(); } private Float caculate(String oper, Float num1, Float num2){ if (oper.equals("+")) { return num1 + num2; } else if (oper.equals("-")) { return num1 - num2; } else if (oper.equals("/")) { return num1 / num2; } else if (oper.equals("*")) { return num1 * num2; } throw new RuntimeException("illeagal operation token"); } }