《算法》1.3.9

110 阅读1分钟

1.3.9

编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。 例如,给定输入:

1 + 2 ) * 3-4 ) * 5-6 ) ) )​​

你的程序应该输出:

( ( 1 + 2 ) * ( ( 3-4 ) * ( 5-6 ) ) )

强势分析一波:刚开始想了一会儿,没什么思路,看了看网上的一些资料才搞懂(丢人了~)。 我们可以这样搞,利用两个栈,一个用来存操作符(+ - * /),一个用来存数值,遍历表达式的时候,各找各妈,各进各栈,当遇到 “)”时,将数值栈pop两次,操作符栈pop一次,利用字符串拼接起来,再存入数字栈中留待输出。 上代码:

import java.util.NoSuchElementException;

/**《算法》1.3.9
 * @author wangxinfu
 */
public class E10309 {
    public static String completeParenthesis(String str){
        if (str == null){
            throw new NoSuchElementException();
        }
        //这里是为了防止空格的影响,有的数字直接没有空格,
        //在split的方法中会收到影响
        str = str.replaceAll("\s*","");
        String[] split = str.split("");
        Stack<String> optStack = new Stack<>();
        Stack<String>numStack = new Stack<>();
        for (String s:split){
            if (check(s)){
                optStack.push(s);
            }else if (")".equals(s)){
                String d1 = numStack.pop();
                String d2 = numStack.pop();
                String op = optStack.pop();
                numStack.push("( " + d2 + " " + op + " "+ d1 + " )");
            }else {
                numStack.push(s);
            }
        }
        return numStack.pop();
    }
    
    private static boolean check(String str){
        return "+".equals(str)|| "-".equals(str)||
                "*".equals(str)|| "/".equals(str);
    }

    public static void main(String[]args){
        String str = "(1 +2 )* 3- 4 ) * 5-6) ) )";
        System.out.println(completeParenthesis(str));
    }

以上代码是建立在合法表达式基础上的,如果您输入的不合法,如5++6等等,程序报错,如果您想知道如何检验表达式请看这里 :github.com/simplewz/Ex…