栈的一个实例——Dijkstra的双栈算术表达式求值法
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());
}
}
posted on 2018-01-03 21:14 Deltadeblog 阅读(1410) 评论(0) 收藏 举报
浙公网安备 33010602011771号