[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 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...
随机推荐
- Kubernetes Pod OOM 排查日记
一.发现问题 在一次系统上线后,我们发现某几个节点在长时间运行后会出现内存持续飙升的问题,导致的结果就是Kubernetes集群的这个节点会把所在的Pod进行驱逐OOM:如果调度到同样问题的节点上,也 ...
- 社区观点 | 理解比原链MOV链上交换协议
去中心化交换协议的发展 从Bitshare,Stellar到以太坊上的Etherdelta,Bancor,0x协议,去中心化交换协议也经过了好几代发展和很多模式的探索,每一代都通过前面的协议的痛点来进 ...
- 企业级Gitlab-ci实践
前言 吐槽一波 2020年6月2号刚入职公司时,第一感觉是集群环境是个大坑!内网一套,公网一套.内网采用单节点Kubernetes,公网采用aliyun托管的X节点Kubernetes(还有节点是2C ...
- java运算符二
一 赋值运算符 /* * 赋值运算符 * +=, -=, *=, /=, %= : * 上面的运算符作用:将等号左右两边计算,会将结果自动强转成等号左边的数据类型,再赋值给等号左边的 * 注意:赋值运 ...
- 2020-07-26:如何用 socket 编程实现 ftp 协议?
福哥答案2020-07-26: 功能用户输入user username.pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径. ...
- JS的数据属性和访问器属性
ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征.ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javasc ...
- 28个漂亮的React.js后台管理模板
React管理模板 为您的React Web应用程序开发一个管理区域可能非常耗时.它与设计所有前端页面一样重要. 这是2020年设计出色的顶级React.js后台管理模板的列表. 这些模板确实有价值, ...
- hook框架-frida使用-环境配置
一.python安装模块 pip3 install frida pip3 install frida-tools 二.下载frida-server #下载链接 https://github.com/f ...
- Jmeter 常用函数(21)- 详解 __char
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 根据给定的字符值转换成 Unicode ...
- java多线程之消费生产模型
需求:要求仓库最大容量为4,且一共只生产20台电视机,下面的代码只适用于一个生产者一个消费者,有没有大佬提点建议怎么改成一对多或多对多不会出现死锁情况 class Warehouse { privat ...