Dijkstra的双栈算术表达式求值法,即是计算算术表达式的值,如表达式(1 + ( (2+3) * (4*5) ) )。
该方法是
使用两个栈分别存储算术表达式的运算符与操作数
忽略左括号
遇到右括号时,操作数栈弹出两个操作数,运算符栈弹出一个运算符,两个操作数按运算符计算,将结果压入操作数栈
如表达式(1 + ( (2+3) * (4*5) ) )的计算流程如下:
public class StackTest { public static void main(String[] args) { String str = "(1 + ( (2+3) * (4*5) ) )"; Stack<String> ops = new Stack<String>(); Stack<Double> vals = new Stack<Double>(); for (int i=0; i<str.length(); i++) { String ele = "" + str.charAt(i); // Neglect the operator "(" and " " if (ele.equals("(") || ele.equals(" ")) ; else if (ele.equals("+")) ops.push(ele); else if (ele.equals("-")) ops.push(ele); else if (ele.equals("*")) ops.push(ele); else if (ele.equals("/")) ops.push(ele); else if (ele.equals(")")) { String op = ops.pop(); double v1 = vals.pop(); double v2 = vals.pop(); if (op.equals("+")) vals.push(v1 + v2); if (op.equals("-")) vals.push(v1 - v2); if (op.equals("*")) vals.push(v1 * v2); if (op.equals("/")) vals.push(v1 / v2); } else vals.push(Double.valueOf(ele)); } System.out.println(vals.pop()); } }