[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刷题之#744-寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4001 访问. 给定一个只包含小写字母的有序数组letters 和 ...
- C#设计模式之19-观察者模式
观察者模式(Observer Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/423 访问. 观察者模式 ...
- C#设计模式之5-单例模式
单例模式(Singleton Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/397 访问. 单例模式属 ...
- C#LeetCode刷题之#557-反转字符串中的单词 III(Reverse Words in a String III)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3955 访问. 给定一个字符串,你需要反转字符串中每个单词的字符顺 ...
- three.js 制作机房(上)
three.js使用的人太少了,一个博文就几百个人看,之前发js基础哪怕是d3都会有几千的阅读量,看看以后考虑说一说d3了,哈哈.吐槽完毕回归正题.前几天郭先生看到网上有人开发了3D机房,正愁博客没什 ...
- mycat数据库集群系列之mycat读写分离安装配置
最近在梳理数据库集群的相关操作,现在花点时间整理一下关于mysql数据库集群的操作总结,恰好你又在看这一块,供一份参考.本次系列终结大概包括以下内容:多数据库安装.mycat部署安装.数据库之读写分离 ...
- unity探索者之微信支付,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/8404604.html 相比微信的登录和分享功能,微信支付sdk的接入显得相当简单, ...
- PythonCrashCourse 第四章习题
Python 从入门到实践第四章习题 4.1想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来 修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅 ...
- Java面试题(JVM篇)
JVM 194.说一下 jvm 的主要组成部分?及其作用? 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库 ...
- 力扣Leetcode 50. 实现Pow(x, n)
实现Pow(x, n) 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 ...