算法(Algorithms)第4版 练习 1.3.9
2017-03-07 11:36
513 查看
主要思路:
用Dijkstra的双栈算法。
遇到数字则压入数字栈中(String)。
遇到运算符则压入运算符栈中(String)。
遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达式(添加左括号)。
再次压入数字栈中(String)。
最后从数字栈中弹出最终的运算表达式。
方法实现:
测试结果:
用Dijkstra的双栈算法。
遇到数字则压入数字栈中(String)。
遇到运算符则压入运算符栈中(String)。
遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达式(添加左括号)。
再次压入数字栈中(String)。
最后从数字栈中弹出最终的运算表达式。
方法实现:
//1.3.9 //only support +-*/ sqrt operator package com.qiusongde; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class AddLeftParentheses { public static void main(String[] args) { Stack<String> ops = new Stack<String>(); Stack<String> vals = new Stack<String>(); while(!StdIn.isEmpty()) { String s = StdIn.readString(); if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("sqrt")) { ops.push(s); } else if(s.equals(")")) { String op = ops.pop();//operator String v = vals.pop();//value if(op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/")) { String subexpression = "( " + vals.pop() + " " + op + " " + v + " )"; vals.push(subexpression); } if(op.equals("sqrt")) { String subexpression = op + " ( " + v + " )"; vals.push(subexpression); } } else { vals.push(s); } } StdOut.println(vals.pop()); } }
测试结果:
相关文章推荐
- 算法(Algorithms)第4版 练习 2.2.11(1)
- 算法(Algorithms)第4版 练习 1.3.37
- 算法(Algorithms)第4版 练习 1.3.42
- 算法(Algorithms)第4版 练习 1.5.3
- 算法(Algorithms)第4版 练习 1.5.7
- 算法(Algorithms)第4版 练习 1.5.23
- 算法(Algorithms)第4版 练习 2.1.27
- 算法(Algorithms)第4版 练习 2.2.5
- 算法(Algorithms)第4版 练习 1.5.8
- 算法(Algorithms)第4版 练习 1.5.14
- 算法(Algorithms)第4版 练习 1.5.16
- 算法(Algorithms)第4版 练习 1.5.24
- 算法(Algorithms)第4版 练习 1.4.1
- 算法(Algorithms)第4版 练习 2.1.4
- 算法(Algorithms)第4版 练习 2.2.11(2)
- 算法(Algorithms)第4版 练习 2.1.25
- 算法(Algorithms)第4版 练习 2.2.9
- 算法(Algorithms)第4版 练习 2.3.25
- 算法(Algorithms)第4版 练习 1.3.32
- 算法(Algorithms)第4版 练习 1.4.5