Dijkstra的双栈算数表达式求值算法
说明:这个算法的输入要求是必须补全所有括号,否则算法会出错,数字和符号之间应该留有一个空格。
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class Evaluate {
public static void main(String[] args) {
// TODO Auto-generated method stub
Stack<String> ops = new Stack<String>();//保存符号
Stack<Double> vals = new Stack<Double>();//保存计算数值
while(!StdIn.isEmpty()){
String s = StdIn.readString();//读取字符
if(s.equals("(")) ;//如果是“(”的话忽略,什么也不做
else if(s.equals("+")) ops.push(s);//如果是+,-,*,/和sqrt的话入栈到ops
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(")")){
double a = vals.pop();
String sign = ops.pop();
if(sign.equals("+")) a = vals.pop()+a;
else if(sign.equals("-")) a = vals.pop()-a;
else if(sign.equals("*")) a = vals.pop()*a;
else if(sign.equals("/")) a = vals.pop()/a;
else if(sign.equals("sqrt")) a = Math.sqrt(a);
vals.push(a);
}
else
vals.push(Double.parseDouble(s));
}
StdOut.println(vals.pop());//最后栈中仅有一个数值,那就是结果
}
}