《算法(第四版)》 习题:1.3.9

时间:2023-02-13 16:09:34
1、问题描述:
编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
((1 + 2) * ((3 - 4) * (5 - 6)))
2、算法思路
参考Dijkstra算术表达式求值算法:使用一个字符串栈,用于存储“计算结果”;此时注意的是,该计算结果是一个字符串,表示一个表达式,遇到右括号就需要计算表达式的值,并加上左右括弧,然后存入原栈又作为操作数看待;即把两个操作数(字符串)和一个运算符(字符串)变换成一个字符串,然后再在结果表达式左右连接括号,当作操作数存入栈。最后运算完成后,只有最后一个补充完整的字符串,只需出栈即可。具体步骤:
1、用空格将输入的数字和符号分隔开,每次读取一个字符串;
2、遇到数字或就运算符就压入字符串栈;
3、遇到右括号,就弹出两个操作数和一个运算符,进行字符串链接,而后作为一个字符串(整体)重新压入字符串栈作为操作数使用;
4、重复上述步骤2、3,最后变成一个整体字符串,即最后一个结果。
3、编程实现(Java实现)
public class Solution_9 {
/**
* Created by Bell-ZHONG on 2016/11/24.
* 从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式;
* 输入: 1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
* 输出: (( 1 + 2 ) * (( 3 - 4 ) * ( 5 - 6 ) ) )
*/

    public static void main(String[] args){    

        Stack<String> StrStack = new Stack<String>();

        while(!StdIn.isEmpty()){

            String s = StdIn.readString();

            if(s.equals(")")){                

                String val = StrStack.pop();

                String op = StrStack.pop();

                val = "("+StrStack.pop()+op+val+")";

                StrStack.push(val);

            }

            else StrStack.push(s);

        }        

        StdOut.print(StrStack.pop());    

    }  

}
4、测试结果
注意 :测试输入时,数字和字符均以空白字符相隔,只能用于双目运算符括弧的补全。
《算法(第四版)》 习题:1.3.9