Dijkstra双栈算术表达式求值算法
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Evaluate {
public static void main(String[] args){
ResizingArrayStack<String> ops = new ResizingArrayStack<>();
ResizingArrayStack<Double> vals = new ResizingArrayStack<>();
while (!StdIn.isEmpty()){
String s = StdIn.readString();
if(s.equals("("));
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 val = vals.pop();
if(op.equals("+")) val += vals.pop();
else if(op.equals("-")) val -= vals.pop();
else if(op.equals("*")) val *= vals.pop();
else if(op.equals("/")) val = vals.pop() / val;
else if(op.equals("sqrt")) val = Math.sqrt(val);
vals.push(val);
}
else {
vals.push(Double.parseDouble(s));
}
}
StdOut.println(vals.pop());
}
}
要点
- 准备两个栈:运算符栈,操作数栈
- 忽略左括号,将操作数和运算符分别压入对应栈内
- 遇到右括号,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的结果压入操作数栈
- 方法局限性:最多只能有两个操作数在括号内运算且算式必须有左括号和右括号
注意事项
所有的字符间都要以空格隔开,在控制台下StdIn.isEmpty()需要接收ctrl+z才能结束输入,在idea中同理接收ctrl+d才能结束输入