[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 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...
随机推荐
- 2020-04-29:现在你有个秒杀抢购的app,用户不断大量增加,技术层面,你要怎么做
2020-04-29:现在你有个秒杀抢购的app,用户不断大量增加,技术层面,你要怎么做,才能既满足用户需求,又能扛住压力,还能帮公司合理支出?福哥答案2020-04-29: 限流(杀部分用户祭天). ...
- 设计模式:建造者模式及在jdk中的体现,建造者模式和工厂模式区别
0.背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们 ...
- [C#] (原创)一步一步教你自定义控件——02,ScrollBar(滚动条)
一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:滚动条(ScollBar). 我们可以在网上看到很多自定义的滚动条控件,它们大都是使用UserControl去做,即至少使用一个P ...
- 学长小清新题表之UOJ 14.DZY Loves Graph
学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...
- JavaScript对象、函数、变量、字符串的处理、运算符
一.对象 使用一种抽象的概念去描述,人{属性,方法} var car={type:"BYD",model:500,color:white,do:function(){"可 ...
- IDEA中列编辑
快捷键 :Alt+Shift+insert,也可以按住Alt+Shift时,点击要编辑部分
- 【全解】Eclipse添加Spring项目插件
1.Eclipse打开window-preference-InstallNewSoftware 2.先点Manage,取消掉The Eclipse Project Updates 3.选择Add . ...
- C++ Templates (1.2 模板实参推断 Template Argument Deduction)
返回完整目录 目录 1.2 模板实参推断 Template Argument Deduction 1.2 模板实参推断 Template Argument Deduction 当调用函数模板(如max ...
- 如何获取东方财富文华新浪财经实时行情数据API接口
BIGI行情期货外汇股指A股期权实时行情数据文华新浪财经API接口新浪财经并非实时行情数据源,所以获取的行情数据源也并非实时的.以下介绍的方法和新浪财经获取行情数据源的方法是一致的.需要实时行情数据源 ...
- Linux环境下安装MySQL数据库
Linux安装mysql服务分两种安装方法: (1).源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: (2).使用官方编译好的二进制文件安装,优 ...