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

来源:互联网 发布:加密文件夹软件下载 编辑:程序博客网 时间:2024/05/22 02:19

更详细的讲解和代码调试演示过程,请参看视频
如何进入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).

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述

0 0
原创粉丝点击