Dijkstra的双栈算数表达式求值算法(《算法》第4版笔记)

文件名为 Evaluate.java

算法思路:

1、使用两个栈分别保存运算符和操作数;

2、将运算符压入栈ops,将操作数压入栈vals;

3、忽略掉左括号,当遇到右括号时,分别从栈ops和栈vals中取出一个运算符和一个操作数,然后根据运算符的类型,判断是否需要继续取操作数,用于做相应的计算;

4、计算完成后,将运算结果压入栈vals;

5、重复以上步骤,直到遇到“=”,则退出;

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

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("+"))
				ops.push(s);
			else if (s.equals("-"))
				ops.push(s);
			else if (s.equals("*"))
				ops.push(s);
			else if (s.equals("/"))
				ops.push(s);
			else if (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;
				else if (op.equals("-"))
					v = vals.pop() - v;
				else if (op.equals("*"))
					v = vals.pop() * v;
				else if (op.equals("/"))
					v = vals.pop() / v;
				else if (op.equals("sqrt"))
					v = Math.sqrt(v);
				vals.push(v);
			}
			else{
				vals.push(Double.parseDouble(s));
			}			
		}
		sc.close();
		System.out.println(vals.pop());
	}
}

运行方式:

打开cmd,使用命令javac Evaluate.java编译,然后使用java Evaluate运行;

输入:

(
(
1
+
sqrt
(
5
)
)
/
2.0
)
=

输出为:

1.618033988749895

参考 https://blog.csdn.net/qq_34803572/article/details/76946437,将输入输出流改为了Java标准库函数;

详情见《算法》第4版 第一章 

 

该算法存在一些问题,目前已知问题如下:无法计算(sqrt(5));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值