面试算法:使用堆栈判断括号的匹配

更详细的讲解和代码调试演示过程,请参看视频
如何进入google,算法面试技能全面提升指南

在写代码的时候,我们往往遇到一个头疼的问题,例如当我们使用很多if else 语句时,特别是 if else 间套地很厉害使,最容易出现的一个问题是,括号不匹配,你突然之间无法判断当前的右括号到底跟上面的那个括号相匹配。

我们人眼看不出来,但编译器缺失明察秋毫,只要你括号不匹配,那么你就不可能编译的过,这节我们看看,编译器是如何快速的查找到括号不匹配的。

给定一个括号字符串:“()()((())(())”,给定一个算法,判断给定的字符串中括号是否匹配。

选择合适的数据结构就能解决算法问题的三分之二,如果我们使用堆栈解决这个问题,那么问题的难度就大大降低了。

我们的算法设计如下:

1, 变量字符串中的每一个字符。

2, 如果扫描到的字符是左括号’(‘, 则把该字符压入堆栈

3, 如果扫描到的是右括号,‘)’,那么如果此时堆栈为空,表示括号字符串不匹配

4, 如果扫描到的是右括号,并且堆栈不为空,那么弹出堆栈顶部的字符。

5, 当每个括号字符都扫描完毕后,堆栈不为空,那么字符串中的括号不匹配,如果堆栈为空,那么字符串中的括号就匹配。

根据上面的算法步骤,我们可以实现以下编码:

import java.util.Stack;


public class ParentMatcher {
    private Stack<Character> stack = new Stack<Character>();

    private String parentStr = "";

    public ParentMatcher(String parents) {
        this.parentStr = parents;
    }

    public boolean isMatch() throws Exception{
        for (int i = 0; i < parentStr.length(); i++) {
            if (parentStr.charAt(i) == '(') {
                stack.push(parentStr.charAt(i));
            } else if (parentStr.charAt(i) == ')') {
                if (stack.size() == 0 || stack.pop() != '(') {
                    return false;
                }
            } else {
                throw new Exception("Illegal character");
            }
        }

        if (stack.size() != 0) {
            return false;
        }

        return true;
    }
}

在主入口函数,我们给上面的类输入一个括号字符串,然后看看运行结果:

public class StackAndQuque {
    public static void main(String[] args) {
        ParentMatcher matcher = new ParentMatcher("((())(())");
        try {
            System.out.println("The matching result is : " + matcher.isMatch());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

由于我们例子中给定的括号字符串是匹配的,因此isMatch()返回结果为true.

我们的算法只需要遍历字符串中的每个字符,因此时间复杂度是O(N), 同时算法并没有申请任何多余内存,因此空间复杂度是O(1).

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
《面试算法:使用堆栈判断括号的匹配》

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