《算法4》——补全左括号的问题

题目

在完成《算法》课后题目的过程中,遇到一道题目内容如下:

编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
((1 + 2) * ((3 - 4) * (5 - 6)))

思路

开始感觉这个题目就有点类似求四则表达式的题目,也就是所谓的双栈法
双栈法的原理如下:

1. 构造两个Stack,分别用来存储操作符(optrStack)和操作数(dataStack).
2. 遍历表达式,如果是操作数,则入操作数栈;如果是运算符,则比较当前运算符和optrStack栈顶运算符的优先级:当优先级大于栈顶运算符时,则操作符入栈。当优先级小于栈顶运算符时,则运算符出栈,同时dataStack出栈两个操作数,计算结果后再将操作数入栈。
3. 重复2,直到optrStack为空为止。

这个题目我们可以参考双栈法实现:

  1. 我们构造两个Stack,操作符栈(optrStack)和操作数栈(dataStack)。
  2. 遍历表达式,如果不是右括号,判断是否为操作符,是则入optrStack,不是则入dataStack;如果是右括号,则将optrStack和dataStack分别出栈,并且构造出“(” + d1 + opt + d2 + “)”的表达式后,再将其入dataStack即可。

参考代码

import java.util.Stack;

/** * Created by wzy on 16-1-17. */
public class CompleteParentese {

    private String completeParentese(String str) {
        Stack<String> optrStack = new Stack<>();
        Stack<String> dataStack = new Stack<>();

        for (int i = 0; i < str.length(); i++) {
            if (isDigit(str.charAt(i))) {
                // 处理数字的情况
                dataStack.push(String.valueOf(str.charAt(i)));
            } else if (isOpeartor(str.charAt(i))) {
                // 处理操作符的情况
                optrStack.push(String.valueOf(str.charAt(i)));
            } else {
                // 处理右括号的情况
                String d2 = dataStack.pop();
                String d1 = dataStack.pop();
                String opt = optrStack.pop();
                String exstr = "(" + d1 + opt + d2 + ")";
                dataStack.push(exstr);
            }
        }

        while (optrStack.size() > 0) {
            String opt = optrStack.pop();
            String d2 = dataStack.pop();
            String d1 = dataStack.pop();
            String exstr = "(" + d1 + opt + d2 + ")";
            dataStack.push(exstr);
        }

        return dataStack.pop();
    }

    private boolean isOpeartor(char ch) {
        return ch == '+' || ch == '-' || ch == '*' || ch == '/';
    }

    private boolean isDigit(char ch) {
        return ch >= '0' && ch <= '9';
    }

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

上述代码没有考虑带空格等特殊字符的情况,大家可以自行增加相关代码。

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/wzy_1988/article/details/50532364
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞