编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。
例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
package Algorithm;
import edu.princeton.cs.algs4.*;
public class basement {
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("//"))
ops.push(s);
else if(s.equals(")")){
String opt=ops.pop();
String val=vals.pop();
String newval="("+vals.pop()+opt+val+")";
vals.push(newval);
}
else
vals.push(s);
}
StdOut.println(vals.pop());
}
}
编这个程序时不禁想起老师之前的话:“写代码有一个陋习:写代码不加注释;比这更糟的是:写完代码后回过头来加注释”。写这个程序时,我边写注释边理思路,效率有提升!
-----大牛老师诚不我欺!