问题描述
编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
((1 + 2) * ((3 - 4) * (5 - 6)))
解决思路
如果不了解Dijkstra双栈算术表达式求值算法,建议先去了解一下,本问题就是根据这个算法中的双栈的思想来解决问题的。
步骤:
1.输入指定字符串,每次读取一个字符串
2.对读取的字符串进行判断操作,是数值就放入操作数栈中,是运算符就放入运算符栈中
3.当读取到的是")"右括号时,弹出两个操作数和弹出一个运算符进行字符串拼接,最后将拼成的字符串在push到操作数栈中
4.最终的结果就在操作数栈中,pop就行
行为轨迹
这里的栈我横着表示,例如:
1 2 3 4 5 6 :1是栈底,6是栈顶
输入 | 输出 | 操作数栈 | 运算符栈 |
---|---|---|---|
1 | 1 | ||
+ | 1 | + | |
2 | 1 2 | + | |
) | (1+2) | ||
* | (1+2) | * | |
3 | (1+2) 3 | * | |
- | (1+2) 3 | * - | |
4 | (1+2) 3 4 | * - | |
) | (1+2) (3-4) | * | |
* | (1+2) (3-4) | * * | |
5 | (1+2) (3-4) 5 | * * | |
- | (1+2) (3-4) 5 | * * - | |
6 | (1+2) (3-4) 5 6 | * * - | |
) | (1+2) (3-4) (5-6) | * * | |
) | (1+2) ((3-4)*(5-6)) | * | |
) | ((1 + 2) * ((3 - 4) * (5 - 6))) | ||
((1 + 2) * ((3 - 4) * (5 - 6))) |
具体代码
需导入algs4.jar,百度一下就可以找到
/**
* 补全左括号
* 输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
* 输出:( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
*/
public class test {
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("*")) ops.push(s);
else if(s.equals("+")) ops.push(s);
else if(s.equals("-")) ops.push(s);
else if(s.equals("/")) ops.push(s);
else if(s.equals(")")) {
String s1 =vals.pop();
String sum="("+vals.pop()+ops.pop()+s1+")";
vals.push(sum);
}else{
vals.push(s);
}
}
System.out.println(vals.pop());
}
}