文件名为 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));