面试算法:使用堆栈判断括号的匹配
来源:互联网 发布:加密文件夹软件下载 编辑:程序博客网 时间: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).
更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
- 面试算法:使用堆栈判断括号的匹配
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 使用堆栈实现括号的匹配
- 【算法】 判断括号是否匹配
- 算法复习--------------利用堆栈实现括号匹配
- 括号成对出现、判断括号是否匹配(不用堆栈)
- 使用栈判断括号匹配
- 匹配括号的算法
- 判断括号的匹配性的一种算法
- 不用堆栈实现的括号匹配
- 判断表达式括号是否匹配,C语言堆栈实现
- 堆栈--括号匹配检验
- 笔试面试算法经典--最长括号匹配
- 堆栈数据结构应用之括号匹配检查(算法3.2.2)
- 算法——括号匹配问题(堆栈应用)
- 简单的括号匹配算法
- 小括号的匹配算法
- 1153 堆栈的使用 括号匹配 表达式求值 (对输入表达式的处理)
- Sping中的JDBC
- 啥都不是的测试啊啊啊啊
- java中Random类用法
- SharePoint online Multilingual support
- Groovy DSL
- 面试算法:使用堆栈判断括号的匹配
- JAVA开发Web Service几种框架介绍
- 浅谈协方差矩阵
- 每天一个 Linux 命令(40):wc命令
- 集成百度地图bug,debug得到的结果是离线定位,但是什么都没有返回
- ajax在.net里的使用方法
- git常用相关命令
- 网络请求框架
- matlab 高级函数 —— circshift、squeeze