栈的应用之检测平衡符号
2016-05-12 16:47
253 查看
前言
本文主要是模拟这样一个场景:编译器检查程序的语法错误,在本文中,我不打算实现某种编程语言的语法检查,而是将问题限定在——检测括号是否成对上。最终我们希望达到这样一个效果:每一个右花括号、右方括号、右大括号,必然要对应一个相应的左花括号、左方括号以及左大括号。也就是说;
1.序列:{[()]} 是合法的。
2.序列:{[()]}} 则是非法的。
算法
本文的算法可以描述如下:做一个空栈,读入字符直到文件尾。如果字符是一个开放字符,则将其推入栈中。如果字符是一个封闭符号,
则当栈空时报错。否则将栈元素弹出,如果弹出的符号不是对应的开发符号,则报错。在文件尾,如果栈非空,则报错。
代码
package com.lemon; import java.util.Stack; /** * 平衡符号检查 * @author lemon * */ public class BracketCheck { /** * 检查表达式中括号是否成对出现 * @param expression:表达式 * @return true:合法;false:非法 */ public boolean isLegal(String expression){ Stack<Character> bracketStack=new Stack<Character>(); char[] charArray = expression.toCharArray(); for(int i=0;i<charArray.length;i++){ char currChar=charArray[i]; if(currChar=='('){ bracketStack.push(currChar); }else if(currChar==')'){ if(bracketStack.isEmpty()){ return false; }else{ Character currCharFromStack=bracketStack.pop(); if(!currCharFromStack.equals('(')){ return false; } } }//end of ')' if(currChar=='['){ bracketStack.push(currChar); }else if(currChar==']'){ if(bracketStack.isEmpty()){ return false; }else{ Character currCharFromStack=bracketStack.pop(); if(!currCharFromStack.equals('[')){ return false; } } }//end of ']' if(currChar=='{'){ bracketStack.push(currChar); }else if(currChar=='}'){ if(bracketStack.isEmpty()){ return false; }else{ Character currCharFromStack=bracketStack.pop(); if(!currCharFromStack.equals('{')){ return false; } } }//end of '}' } if(bracketStack.isEmpty()){ return true; } return false; } }
package com.lemon; import org.junit.Test; public class TestBracketCheck { @Test public void testCase1(){ BracketCheck bc=new BracketCheck(); String expr="{[()]}"; System.out.println(expr+":"+bc.isLegal(expr)); } @Test public void testCase2(){ BracketCheck bc=new BracketCheck(); String expr="{[()]}}"; System.out.println(expr+":"+bc.isLegal(expr)); } }
测试
测试结果如下:相关文章推荐
- 第十周项目4——教师兼干部类
- 关于SwiperefreshLayout使用
- 数据库大型应用解决方案总结
- 1111
- 基于DFS的拓扑排序
- HTML5 之前的视频播放格式
- CocoaPods 安装 使用
- (OK) Creates Docker-based Virtual PC containers for use inside GNS3 as end hosts.
- APP 屏蔽 触发事件
- 2.Linux的ACL权限
- 开篇介绍和工程目录结构-(从零开始搭建android框架系列(1))
- 不容错过,最全的安卓架构合集-(从零开始搭建android框架系列(2))
- 假设有n个布尔变量x1, ..., xn,输出其所有可能的真值集合
- 深度学习领域相关资料
- 多视角看云平台中的服务可用性
- 字符串匹配算法
- 常见数字正则验证
- mongoVUE的增删改查操作使用说明
- grep awk sed 练习题
- 实用技巧——获取验证码的倒计时