Stack是一种先进后出的数据结构后,这个特点决定了它在递归向下的场景中有独到的功效。

以下程序展示了它在检查表达式中括号匹配的有效性:

程序:

  1. package com.heyang.util;
  2.  
  3. import java.util.Collections;
  4. import java.util.Stack;
  5.  
  6. class Bracket{
  7. char type;
  8. int idx;
  9.  
  10. public Bracket(char type,int idx) {
  11. this.type=type;
  12. this.idx=idx;
  13. }
  14. }
  15.  
  16. // Used to check if the brackets in a expression is balanced
  17. public class BracketChecker {
  18. private String errMsg;
  19.  
  20. public String getErrMsg() {
  21. return errMsg;
  22. }
  23.  
  24. public boolean isBalanced(String expression) {
  25. boolean retval=false;
  26.  
  27. try {
  28. retval=checkBalanced(expression);
  29. }catch(Exception ex) {
  30. errMsg=ex.getMessage();
  31. }
  32.  
  33. return retval;
  34. }
  35.  
  36. private boolean checkBalanced(String expression) throws Exception{
  37. int length=expression.length();
  38. Stack<Bracket> stack=new Stack<Bracket>();
  39.  
  40. for(int i=0;i<length;i++){
  41. char ch=expression.charAt(i);
  42.  
  43. if(ch=='{' || ch=='[' || ch=='('){
  44. stack.push(new Bracket(ch,i));
  45. }else if(ch==')' || ch==']' || ch=='}'){
  46. if(stack.isEmpty()) {
  47. throw new Exception(buildErrorMsg(expression,ch,i));
  48. }else {
  49. Bracket popedBracket=stack.pop();
  50.  
  51. if( (ch==')' && popedBracket.type !='(') ||
  52. (ch==']' && popedBracket.type !='[') ||
  53. (ch=='}' && popedBracket.type !='{') ){
  54. throw new Exception(buildErrorMsg(expression,popedBracket.type,popedBracket.idx));
  55. //throw new Exception(buildErrorMsg(expression,ch,i));
  56. }
  57. }
  58. }
  59. }
  60.  
  61. Bracket popedBracket=null;
  62. while(stack.isEmpty()==false) {
  63. popedBracket=stack.pop();
  64. }
  65. if(popedBracket!=null) {
  66. throw new Exception(buildErrorMsg(expression,popedBracket.type,popedBracket.idx));
  67. }
  68.  
  69. return true;
  70. }
  71.  
  72. // build error message
  73. private String buildErrorMsg(String expression,char ch,int idx) {
  74. StringBuilder sb=new StringBuilder();
  75. sb.append(""+expression+"\n");
  76. sb.append(createRepeatedStr(" ",idx)+"^");
  77. sb.append(" This bracket '"+ch+"' has not matched bracket!\n");
  78.  
  79. return sb.toString();
  80. }
  81.  
  82. // Repeat seed with n times
  83. private static String createRepeatedStr(String seed,int n) {
  84. return String.join("", Collections.nCopies(n, seed));
  85. }
  86.  
  87. // Entry point
  88. public static void main(String[] args) {
  89. BracketChecker bbc=new BracketChecker();
  90.  
  91. String[] arr= {"123)456","5+2*(3+3)","{[(2+4)*8]/6}","[()]}","{[(]}","{[](","((((())))))","((([((())))))","[[[[[]]]]]","{[(((((()))))))]}"};
  92.  
  93. int index=0;
  94. for(String expression:arr) {
  95. index++;
  96.  
  97. boolean balanced=bbc.isBalanced(expression);
  98. if(!balanced) {
  99. System.out.println("#"+index+"\n"+bbc.getErrMsg());
  100. }
  101. }
  102. }
  103. }

输出:

  1. #1
  2. 123)456
  3. ^ This bracket ')' has not matched bracket!
  4.  
  5. #4
  6. [()]}
  7. ^ This bracket '}' has not matched bracket!
  8.  
  9. #5
  10. {[(]}
  11. ^ This bracket '(' has not matched bracket!
  12.  
  13. #6
  14. {[](
  15. ^ This bracket '{' has not matched bracket!
  16.  
  17. #7
  18. ((((())))))
  19. ^ This bracket ')' has not matched bracket!
  20.  
  21. #8
  22. ((([((())))))
  23. ^ This bracket '[' has not matched bracket!
  24.  
  25. #10
  26. {[(((((()))))))]}
  27. ^ This bracket '[' has not matched bracket!

--2020年5月23日--

[Java数据结构]使用Stack检查表达式中左右括号是否匹配的更多相关文章

  1. Java 数据结构之Stack

    Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构.Stack继承Vector,并对其进行了扩展. 用法: 1.只有一个构造函数: public Stack() {} 2.创建 ...

  2. Java数据结构漫谈-Stack

    Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点. Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的. cla ...

  3. java数据结构 栈stack

    栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...

  4. 【js数据结构】栈解决括号不匹配问题

    栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...

  5. java实现括号的匹配

    括号的匹配 下面的代码用于判断一个串中的括号是否匹配 所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉 例如: -(-[-]-)- 是允许的 -(-[-)-]- 是禁止的 对于 mai ...

  6. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  8. java数据结构与算法之栈(Stack)设计与实现

    本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...

  9. 【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法

    Java面试题:解释内存中的栈(stack).堆(heap)和静态存储区的用法 堆区: 专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...

随机推荐

  1. Kubernetes Pod OOM 排查日记

    一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现内存持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐OOM:如果调度到同样问题的节点上,也 ...

  2. 社区观点 | 理解比原链MOV链上交换协议

    去中心化交换协议的发展 从Bitshare,Stellar到以太坊上的Etherdelta,Bancor,0x协议,去中心化交换协议也经过了好几代发展和很多模式的探索,每一代都通过前面的协议的痛点来进 ...

  3. 企业级Gitlab-ci实践

    前言 吐槽一波 2020年6月2号刚入职公司时,第一感觉是集群环境是个大坑!内网一套,公网一套.内网采用单节点Kubernetes,公网采用aliyun托管的X节点Kubernetes(还有节点是2C ...

  4. java运算符二

    一 赋值运算符 /* * 赋值运算符 * +=, -=, *=, /=, %= : * 上面的运算符作用:将等号左右两边计算,会将结果自动强转成等号左边的数据类型,再赋值给等号左边的 * 注意:赋值运 ...

  5. 2020-07-26:如何用 socket 编程实现 ftp 协议?

    福哥答案2020-07-26: 功能用户输入user username.pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径. ...

  6. JS的数据属性和访问器属性

    ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...

  7. 28个漂亮的React.js后台管理模板

    React管理模板 为您的React Web应用程序开发一个管理区域可能非常耗时.它与设计所有前端页面一样重要. 这是2020年设计出色的顶级React.js后台管理模板的列表. 这些模板确实有价值, ...

  8. hook框架-frida使用-环境配置

    一.python安装模块 pip3 install frida pip3 install frida-tools 二.下载frida-server #下载链接 https://github.com/f ...

  9. Jmeter 常用函数(21)- 详解 __char

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 根据给定的字符值转换成 Unicode ...

  10. java多线程之消费生产模型

    需求:要求仓库最大容量为4,且一共只生产20台电视机,下面的代码只适用于一个生产者一个消费者,有没有大佬提点建议怎么改成一对多或多对多不会出现死锁情况 class Warehouse { privat ...