《Java数据结构与算法》笔记-CH4-3用栈实现分隔符匹配
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* 利用栈来实现分隔符匹配: 分隔符包括{},[], (),每个左分隔符要和右分隔符匹配,也就是说每个'{'后面要有'}'来匹配,以此类推。
* 同时,在字符串中后出现的左分隔符应该比早出现的左分隔符要先完成匹配。 例如:c[d] //correct a{b[cd]e} //correct
* a[b{c}]} //incorrect a{b[c)} //incorrect a{b[c] //incorrect
*
* 算法思想:逐个读取字符串字符: 读到非分隔符字符,继续; 读到左分隔符,就入栈;
* 读到右分隔符,就和从栈顶弹出的左分隔符进行匹配,若不匹配,就返回false;若匹配就继续进行; 如果读到最后,栈中有剩余,则返回false。
*/
class StackB {
private int maxSize;
private char[] array;
private int top; public StackB(int size) {
maxSize = size;
array = new char[maxSize];
top = -1;
} public void push(char ch) {
array[++top] = ch;
} public char pop() {
return array[top--];
} public char peek() {
return array[top];
} public boolean isEmpty() {
return top == -1;
} public boolean isFull() {
return top == maxSize;
}
} class BracketCheck {
private String input; public BracketCheck(String in) {
input = in;
} /**
* 匹配检查
* @return
*/
public boolean check() {
int len = input.length();
StackB stack = new StackB(len);
for (int i = 0; i < len; i++) {
char c = input.charAt(i);
switch (c) {
case '{':
case '[':
case '(':// 如果读到左分隔符,进行入栈操作
stack.push(c);
break;
case '}':
case ']':
case ')':// 读到右分隔符
if (stack.isEmpty()) {// 如果栈为空,说明多出来的右分隔符在栈中没有与之匹配的分隔符,就返回false
System.out.println("error! " + c + " at " + i);
return false;
} else {
char ch = stack.pop();// 如果栈不空,就进行pop出栈
// 如果出栈的左分隔符ch和读到的右分隔符c不匹配,就返回false
if ((ch == '{' && c != '}') || (ch == '[' && c != ']') || (ch == '(' && c != ')')) {
System.out.println("error! " + c + " at " + i);
return false;
}
}
break;
default:
break;
}
}
if (stack.isEmpty())
return true;
return false;
}
} public class BracketApp {
public static void main(String[] args) throws IOException {
String input;
while (true) {
System.out.println("please input string containing delimiters: ");
System.out.flush();
input = getString();
if (input.equals(""))// 读到直接回车换行停止循环
break;
BracketCheck bc = new BracketCheck(input);
System.out.println(bc.check());
}
} /**
* 读取字符串
*
* @return
* @throws IOException
*/
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
return reader.readLine();
}
}
《Java数据结构与算法》笔记-CH4-3用栈实现分隔符匹配的更多相关文章
- Java数据结构和算法(四):栈
一.简介 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底(Bottom),最后的数据在 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- java数据结构和算法06(红黑树)
这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...
- Java数据结构和算法
首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(十四)——堆
在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
随机推荐
- mac root用户初始密码设置
具体方法如下: 1)sudo su切换到root,输入的用户密码是当前用户的密码: 2)切换到root后,执行passwd root,设置root用户密码即可.
- 数组 寻找最大的第k个数
int Partion(int asy[],int begin,int end) { int k=begin; int key=asy[end]; for(int i=begin;i<=end; ...
- mysql 插入汉字 异常 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name'
今天使用mysql出现 Incorrect string value: '\xE8\xA7\x84\xE5\x88\x99' for column 'name' 异常 通过查找问题,发现是字段编码不支 ...
- android线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程 ...
- uva11181Probability|Given
枚举,条件概率. 2^20次方等于100w,是大约可以没准还能过的. 二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),t ...
- 大流量IIS负载均衡NLB解决方案
说白了就是 用多台WEB服务器 同时处理大量的http请求! 机器越多力量越大呵呵!!! 在现行的许多网络应用中,有时一台服务器往往不能满足客户端的要求,此时只能通过增加服务器来解决问题. 那么 ...
- javascript数组详解
1.数组的一些方法: <script type="text/javascript"> //var arr = [1,2,3,4]; //性能略高 var arr = n ...
- BZOJ2086: [Poi2010]Blocks
题解: 想了想发现只需要求出最长的一段平均值>k即可. 平均值的问题给每个数减去k,判断是否连续的一段>0即可. 然后我们发现如果i<j 且 s[i]<s[j],那么 j 对于 ...
- 最简单的视音频播放示例5:OpenGL播放RGB/YUV
本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenG ...
- db2数据库Date相关函数
1.db2可以通过SYSIBM.SYSDUMMY1.SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值. SELECT 'HELLO DB2' FROM SYSIBM ...