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<String> ops=new Stack<String>();
		Stack<Double> vals=new Stack<Double>();
		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--双栈的利用







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值