Ex1_3_9 补全缺少左括号的中缀表达式
  1. import edu.princeton.cs.algs4.StdIn;
  2. import edu.princeton.cs.algs4.StdOut;
  3. public class Ex1_3_9 {
  4. public static void main(String[] args){
  5. Stack<String> vals = new Stack<>();
  6. Stack<String> ops = new Stack<>();
  7. while (!StdIn.isEmpty()){
  8. String s = StdIn.readString();
  9. if(s.equals("+")) ops.push(s);
  10. else if(s.equals("-")) ops.push(s);
  11. else if(s.equals("*")) ops.push(s);
  12. else if(s.equals("/")) ops.push(s);
  13. else if(s.equals("sqrt")) ops.push(s);
  14. else if(s.equals(")")){
  15. String op= ops.pop();
  16. String val = vals.pop();
  17. if(op.equals("sqrt")){//需满足sqrt中为两个值的运算
  18. String exp = String.format("( %s %s )",op,val);
  19. vals.push(exp);
  20. }else {
  21. String exp = String.format("( %s %s %s )", vals.pop(), op, val);
  22. vals.push(exp);
  23. }
  24. }
  25. else{
  26. vals.push(s);
  27. }
  28. }
  29. StdOut.println(vals.pop());
  30. }
  31. }
  32. */1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )补全后
  33. ( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
  34. sqrt 3 + 5 ) )补全后
  35. ( sqrt ( 3 + 5 ) )
  36. /*

要点:

  1. 使用堆栈,用String.format()前各弹出一个符号和数值