[Java数据结构]使用Stack检查表达式中左右括号是否匹配
Stack是一种先进后出的数据结构后,这个特点决定了它在递归向下的场景中有独到的功效。
以下程序展示了它在检查表达式中括号匹配的有效性:
程序:
package com.heyang.util; import java.util.Collections;
import java.util.Stack; class Bracket{
char type;
int idx; public Bracket(char type,int idx) {
this.type=type;
this.idx=idx;
}
} // Used to check if the brackets in a expression is balanced
public class BracketChecker {
private String errMsg; public String getErrMsg() {
return errMsg;
} public boolean isBalanced(String expression) {
boolean retval=false; try {
retval=checkBalanced(expression);
}catch(Exception ex) {
errMsg=ex.getMessage();
} return retval;
} private boolean checkBalanced(String expression) throws Exception{
int length=expression.length();
Stack<Bracket> stack=new Stack<Bracket>(); for(int i=0;i<length;i++){
char ch=expression.charAt(i); if(ch=='{' || ch=='[' || ch=='('){
stack.push(new Bracket(ch,i));
}else if(ch==')' || ch==']' || ch=='}'){
if(stack.isEmpty()) {
throw new Exception(buildErrorMsg(expression,ch,i));
}else {
Bracket popedBracket=stack.pop(); if( (ch==')' && popedBracket.type !='(') ||
(ch==']' && popedBracket.type !='[') ||
(ch=='}' && popedBracket.type !='{') ){
throw new Exception(buildErrorMsg(expression,popedBracket.type,popedBracket.idx));
//throw new Exception(buildErrorMsg(expression,ch,i));
}
}
}
} Bracket popedBracket=null;
while(stack.isEmpty()==false) {
popedBracket=stack.pop();
}
if(popedBracket!=null) {
throw new Exception(buildErrorMsg(expression,popedBracket.type,popedBracket.idx));
} return true;
} // build error message
private String buildErrorMsg(String expression,char ch,int idx) {
StringBuilder sb=new StringBuilder();
sb.append(""+expression+"\n");
sb.append(createRepeatedStr(" ",idx)+"^");
sb.append(" This bracket '"+ch+"' has not matched bracket!\n"); return sb.toString();
} // Repeat seed with n times
private static String createRepeatedStr(String seed,int n) {
return String.join("", Collections.nCopies(n, seed));
} // Entry point
public static void main(String[] args) {
BracketChecker bbc=new BracketChecker(); String[] arr= {"123)456","5+2*(3+3)","{[(2+4)*8]/6}","[()]}","{[(]}","{[](","((((())))))","((([((())))))","[[[[[]]]]]","{[(((((()))))))]}"}; int index=0;
for(String expression:arr) {
index++; boolean balanced=bbc.isBalanced(expression);
if(!balanced) {
System.out.println("#"+index+"\n"+bbc.getErrMsg());
}
}
}
}
输出:
#1
123)456
^ This bracket ')' has not matched bracket! #4
[()]}
^ This bracket '}' has not matched bracket! #5
{[(]}
^ This bracket '(' has not matched bracket! #6
{[](
^ This bracket '{' has not matched bracket! #7
((((())))))
^ This bracket ')' has not matched bracket! #8
((([((())))))
^ This bracket '[' has not matched bracket! #10
{[(((((()))))))]}
^ This bracket '[' has not matched bracket!
--2020年5月23日--
[Java数据结构]使用Stack检查表达式中左右括号是否匹配的更多相关文章
- Java 数据结构之Stack
Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构.Stack继承Vector,并对其进行了扩展. 用法: 1.只有一个构造函数: public Stack() {} 2.创建 ...
- Java数据结构漫谈-Stack
Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点. Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的. cla ...
- java数据结构 栈stack
栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构. 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部. 当你从栈中取元素的时候,就从栈顶 ...
- 【js数据结构】栈解决括号不匹配问题
栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...
- java实现括号的匹配
括号的匹配 下面的代码用于判断一个串中的括号是否匹配 所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉 例如: -(-[-]-)- 是允许的 -(-[-)-]- 是禁止的 对于 mai ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- 【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
Java面试题:解释内存中的栈(stack).堆(heap)和静态存储区的用法 堆区: 专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...
随机推荐
- C#LeetCode刷题之#136-只出现一次的数字(Single Number)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4046 访问. 给定一个非空整数数组,除了某个元素只出现一次以外, ...
- moonlight不显示鼠标指针
多显示屏导致moonlight不显示鼠标指针, 使用的时候关闭其他显示屏,只使用一个显示屏,就可以正常显示了.
- 涨见识!Java String转int还有这种写法
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个有颜值却假装靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题 ...
- node-sass 报错的解决方法
今天在运行项目发现原来好好的项目报错了.报错大致信息如下: 这段代码是我升级node之后里面根据不同的项目位置什么的会有所不同. 简单的说,这段代码意思是node-sass 不兼容 node v8 的 ...
- Python定时任务轻量解决方案---Schedule
写后端的同学们可能都知道,工作中可能需要周期性执行一些任务,俗称定时任务.Linux环境下,可以借助于系统自带的crontab完成定时任务.但是很多时候,开发的同学们可能并没有权限去操作crontab ...
- java+opencv实现图像灰度化
灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0.所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰 ...
- Quartz:基本用法总结
OpenSymphony所提供的Quartz是任务调度领域享誉盛名的开源框架.Spring提供了集成Quartz的功能,可以让开发人员以更面向Spring的方式创建基于Quartz的任务调度应用.任务 ...
- go thrift demo
接口:https://gowalker.org/github.com/apache/thrift/lib/go/thrift 参考文件:https://cong.im/2018/05/14/other ...
- 第一篇scrum冲刺博客--Interesting-Corps
第一篇scrum冲刺博客 一.Alpha阶段各成员任务 鲍鱼铭 任务名称 预计时间 主页页面和探测空间设计及布局实现 6h 主页页面跳转社区功能及社区设计及布局实现 6h 搜索页面跳转.设计及布局实现 ...
- 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
这几天的确有空了,看更新多快,专门研究了一下几个网站登录中密码加密方法,比起滑块验证码来说都相对简单,适合新手js逆向入门,大家可以自己试一下,试不出来了再参考我的js代码.篇幅有限,完整的js代码在 ...