Dijkstra的双栈算术表达式(未省略括号)求值算法(algs4)


package method;

import java.util.Scanner;
import java.util.Stack;


/*
 * Dijkstra的双栈算术表达式(未省略括号)求值算法
 * 用两个栈(一个用于保存运算符,一个用于保存操作数)
 * 1.将操作数压入操作数栈;
 * 2.将运算符压入运算符栈;
 * 3.忽略左括号;
 * 4.在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈;
*/
public class Evaluate
{
	public static void main(String[] args)
	{
		Stack ops=new Stack();
		Stack vals=new Stack();
		Scanner sc=new Scanner(System.in);
		
		while(sc.hasNext())
		{/*读取字符,如果是运算符则将它压入运算符栈*/
			String s=sc.nextLine();
			if(s.equals("("));
			else if(s.equals("="))
				break;
			else if(s.equals("+")||s.equals("-")||s.equals("*")||
					s.equals("/")||s.equals("sqrt"))
				ops.push(s);
			else if(s.equals(")"))
					{/*如果字符是“(”,弹出运算符和操作数,计算结果并压入操作数栈*/
						String op=ops.pop();
						double v=vals.pop();
						if(op.equals("+"))
							v=vals.pop()+v;
						if(op.equals("-"))
							v=vals.pop()-v;
						if(op.equals("*"))
							v=vals.pop()*v;
						if(op.equals("/"))
							v=vals.pop()/v;
						if(op.equals("sqrt"))
							v=Math.sqrt(v);
						vals.push(v);
					}
			else /*如果字符既非运算符也非括号,将它作为double值压入操作数栈*/
				vals.push(Double.parseDouble(s));
		 }
		 sc.close();
		 System.out.println(vals.pop());
	}
}
 ((1+sqrt(5))/2.0)=
(
(
1
+
sqrt
(
5
)
)
/
2.0
)
=
1.618033988749895
(1+((2+3)*(4*5))) =

(
1
+
(
(
2
+
3
)
*
(
4
*
5
)
)
)
=
101.0


相关拓展阅读:

算法4--双栈的利用







你可能感兴趣的:(线性结构,====算法,====,算法(第四版))