Ex1_3_11 计算后序表达式
  1. import edu.princeton.cs.algs4.StdIn;
  2. import edu.princeton.cs.algs4.StdOut;
  3. public class Ex1_3_11 {
  4. public static void main(String[] args){
  5. Stack<Double> vols = new Stack<>();
  6. while (!StdIn.isEmpty()){
  7. String s = StdIn.readString();
  8. double vol = 0;
  9. switch (s){
  10. case "+":
  11. vol = vols.pop() + vols.pop();
  12. vols.push(vol);
  13. break;
  14. case "-":
  15. vol = -vols.pop() + vols.pop();
  16. vols.push(vol);
  17. break;
  18. case "*":
  19. vol = vols.pop() * vols.pop();
  20. vols.push(vol);
  21. break;
  22. case "/":
  23. vol = 1/vols.pop() * vols.pop();
  24. vols.push(vol);
  25. break;
  26. case "sqrt":
  27. vol = Math.sqrt(vols.pop());
  28. vols.push(vol);
  29. break;
  30. default:
  31. vol = Double.parseDouble(s);
  32. vols.push(vol);
  33. break;
  34. }
  35. }
  36. StdOut.println(vols.pop());
  37. }
  38. }

要点:

  1. 使用双栈法变形
  2. 注意pop出的顺序