Dijkstra方法
创建了两个栈,一个用来存放运算符 ops,一个存放操作数 vals,遇到左括号跳过,遇到右括号将vals栈顶的两个元素执行ops栈顶的操作。
package com.chap1.algorithm;
import java.util.Stack;
import edu.princeton.cs.algs4.StdIn;
public class DijkstraEvaluate {
public static void main(String[] args)
{
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("+");
else if(s.equals("-"))
ops.push("-");
else if(s.equals("*"))
ops.push("*");
else if(s.equals("/"))
ops.push("/");
else if(s.equals("sqrt"))
ops.push("sqrt");
else if(s.equals(")"))
{
String op = ops.pop();
double v = vals.pop();
if(op.equals("+"))
v = v + vals.pop();
else if(op.equals("-"))
v = v - vals.pop();
else if(op.equals("*"))
v = v * vals.pop();
else if(op.equals("/"))
v = v / vals.pop();
else if(op.equals("sqrt"))
v = Math.sqrt(v);
vals.push(v);
}
else
vals.push(Double.parseDouble(s));
}
System.out.println(vals.pop());
}
}