JAVA栈应用之括号匹配

在数据处理中,常常要判断数据中的括号,应用栈来处理及其方便。
当用户输入一个字符串时,遇到左括号时,将其入栈,如’(’ ‘[”’{,而遇到右括号时,如’)”}”]’时,与栈顶的括号与当前匹配,如果匹配成功,则将栈中的括号出栈,表示当前括号成对。

如匹配失败,又分为两种情况,栈已经空和栈不空,若栈已空,则现在右括号比左括号多()},栈不空则很明显,当前括号与栈中括号不匹配(}.

当所有的匹配完成,也有两种状态,栈空或不空,栈空,当前字符串中所有字符匹配成功,栈不空,则还有左括号待匹配,说明左括号多。

代码

这里不再对栈作深入说明,详细说明在这里:
>JAVA实现栈<

package bracket;interface Stack {
void stackPush(Object obj);// 入栈void stackPop();// 出栈int size();// 栈元素数量Object stackTop();// 取栈顶void printStak();// 辅助函数,打印栈中元素
}class StackImp implements Stack {
// 栈中要有啥?1.元素数量(头节点),里面放栈头和尾巴
// 栈的每个节点放元素和下一个节点的位置
private int size;
private Node first;
private Node last;// 建一个内部类,实例化节点
private class Node {// 只能此内部访问,private修饰,增强安全性private Object item;private Node next;private Node(Object item, Node next) {//this.item = item;this.next = next;}
}@Override
public void stackPush(Object obj) {Node tmp = this.first;Node newNode = new Node(obj, null);this.last = newNode;if (null == this.first) {// 首次时this.first = newNode;} else {while (null != tmp.next) {tmp = tmp.next;}tmp.next = newNode;}++this.size;
}@Override
public void stackPop() {Node tmp = this.first;if (null == tmp.next) {this.first = null;this.last = null;this.size = 0;return;}while (null != tmp.next.next) {tmp = tmp.next;}this.last = tmp;tmp.next = null;--this.size;
}@Override
public int size() {return this.size;
}@Override
public Object stackTop() {return this.last.item;// 不是返回return this.last啊
}@Override
public void printStak() {Node tmp = this.first;if (null == this.first) {return;}while (null != tmp.next) {System.out.print(tmp.item + "->");tmp = tmp.next;}System.out.println(tmp.item);
}
}class Factory {
public static Stack getStack() {return new StackImp();}
}public class Test {
public static void main(String[] args) {Stack stack = Factory.getStack();String str = "(())hello Jan{{}}";// 括号匹配:左边括号入栈,右边括号,取栈,是一对,pop,不是,return wrong// 肯能会用到 字符串 转字符数组 char [] strarr = str.toCharArray();bracket(stack, str);// ++++++++++栈检测++++++++++// System.out.println(stack.size());// stack.stackPush(1);// stack.stackPush(2);// stack.stackPush(3);// stack.stackPush(4);// stack.stackPush(5);stack.stackPop();// System.out.println(stack.size());// stack.printStak();}public static void bracket(Stack stack, String str) {if (null == str) {return;}char[] strarr = new char[str.length()];// 这里的length()区别于数组中的length,前是方法,后是数组变量strarr = str.toCharArray();// 直接就放进去了int i = 0;// 大小写转换 CTRL+ shift x/ywhile (i < strarr.length) {// 先判断是不是括号,是左括号,入栈if ('(' == strarr[i] || '[' == strarr[i] || '{' == strarr[i]) {stack.stackPush(strarr[i]);++i;// 前置效率高,不产生临时变量continue;// 入栈后面就不用再走了}if (')' == strarr[i] || ']' == strarr[i] || '}' == strarr[i]) {// 是右边括号if (stack.size() == 0) {// 栈空了,还来右边括号,那右边括号多System.out.println("右括号多");++i;return;}char c = stack.stackTop().toString().charAt(0);// 曲线救国,对象转字符串再转字符if ((c == '(' && ')' == strarr[i]) || (c == '[' && ']' == strarr[i])|| (c == '{' && '}' == strarr[i])) {stack.stackPop();// 栈中的括号与当前匹配++i;continue;} else {// 此时栈中与当前括号不匹配//[}System.out.println("括号不匹配");++i;return;}}++i;}if (stack.size() != 0) {// 循环结束,要么完全匹配(栈空),要么左边括号多(栈不空),System.out.println("左括号多");return;}System.out.println("匹配 =.=");}
}

栈的相关应用还有>JAVA栈应用之RPN逆波兰表达式求值<,本次>JAVA栈应用之括号匹配源码<已上传,以及C语言版本的>C栈应用之括号匹配源码<

JAVA栈应用之括号匹配相关推荐

  1. 栈应用之 括号匹配问题(Python 版)

    栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出 ...

  2. 数据结构实验之栈四:括号匹配

     数据结构实验之栈四:括号匹配 Description 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. Inp ...

  3. 栈的应用--括号匹配的检验

    算法中设置一个栈,每次读入一个括号,若是右括号,则或者与置于栈顶的括号匹配,或者是不合法的情况,若是左括号,则入栈.若算法结束,栈是空的,则括号合法. 括号匹配函数 Status bracket_ma ...

  4. sdut 数据结构实验之栈四:括号匹配

    数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description ...

  5. c语言栈训练题目:括号匹配

    c语言栈训练题目:括号匹配 基本思路: 当前字符不是括号,不做处理: 当前字符是左括号,则进栈: 当前字符是右括号:若栈空,则表明该"右括号"多余,不匹 配,结束:否则和栈顶元素比 ...

  6. 栈的应用 括号匹配 c++

    在算术表达式中,除了加.减.乘.除等运算外,往往还有括号.包括有大括号{},中括号[],小括号(),尖括号<>等. 对于每一对括号,必须先左边括号,然后右边括号:如果有多个括号,则每种类型 ...

  7. 栈应用之括号匹配(C语言)

    { ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的.] } ) 宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号 ...

  8. 栈的应用-括号匹配的检验

    1.算法描述 在括号匹配算法中定义int flag = 1变量来标记匹配结果是成功还是失败! 利用数据结构栈,从左到右依次扫描字符串:若是遇到左括号入栈:若是遇到右括号:若栈非空,使用Pop(s,to ...

  9. [栈应用一] 括号匹配问题

    stack<int> S;   定义一个元素类型为int的堆栈S S.push(i);    向堆栈中压入一个数 int x = S.pop();   读取栈顶元素,并赋值x S.pop( ...

最新文章

  1. autohotkey快捷键
  2. 1044 Shopping in Mars
  3. [case12]演进式架构
  4. 4 拼接_解析,地漏与瓷砖的4种拼接方法及安装工艺
  5. MySQL数据库:触发器Trigger
  6. 微软Visual Studio 2012软件功能介绍
  7. 收获,不止SQL优化——抓住SQL的本质--第六章
  8. 五,通道之间的数据传输
  9. 《深度学习笔记》——“损失函数loss乘以正数因子a是否等价于学习率lr乘以a呢?”
  10. 用unity3d切割图片
  11. android最优化启动画面,Android启动页黑屏及最优解决方案
  12. 请求发送者与接收者解耦——命令模式(四)
  13. 《概率论与数理统计》之常见概率分布
  14. boost::bind 详解
  15. Bzoj 3654 图样图森波 题解
  16. 微习惯养成,互联网产品成败的关键因素
  17. 那些年,我们关注过的放大电路设计要点
  18. mysql 跨库插入_sql 跨库和域插入数据库
  19. 毕马威《2021年中国证券业调查报告》:金融科技和数字化将成为发展核心
  20. 微信小程序点击弹出输入框

热门文章

  1. AI解读清明上河图--Caption Anything 细粒度可控的图像描述
  2. java中super的用途
  3. NetAlly Aircheck G2 WIFI测试仪新版 5.2 版新功能介绍
  4. 【Linux】 Apache配置文件详解
  5. 【LOJ6681】yww 与树上的回文串(点分治)(AC自动机)(字符串哈希)(回文串broder理论)
  6. 2021年安全员-C证考试试卷及安全员-C证模拟考试题库
  7. linux ms漏洞,Samba MS-SAMR/MS-LSAD中间人攻击漏洞(CVE-2016-2118)
  8. 免费:剑侠情缘2小清心整合版VM一键端
  9. l3asnumanode 设置_NUMA 配置
  10. JVM内存调优参数概要