栈的一个实例——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());
	}
}

  

原文地址:https://www.cnblogs.com/deltadeblog/p/8185730.html