《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: 堆是有如下特点的二叉 ...
随机推荐
- tomcat 内存配置
在bin目录下的catalina.bat里添加如下代码: rem ----- Execute The Requested Command ------------------------------- ...
- Java泛型中的extends和super关键字
理解List<? extends T> list, T key, Comparator<? super T> c 这些一般用在方法形参类型上,用于接受泛型对象. 1.List& ...
- java 菱形
//画菱形 一半 for(int hs=1;hs<11;hs++) //行数 { //画空格 for(int kg = 9; kg >= hs; kg--) //空格数 { System. ...
- TeeChart的X轴,使用伪装的时间
TeeChart曲线的X轴是时间,但是频率很高.没法完全显示. 例如,一秒钟有2000个点,那么点与点的间隔为0.5毫秒. 使用TChart类的GetAxisLabel事件, 函数手册上对此事件的解释 ...
- uva12034Race
递推,组合. 考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可.. #include<cstdio> #include<algorithm> #i ...
- 64位SqlServer通过链接服务器与32位oracle通讯
在SQL SERVER里只安装了32位的oracle客户端的情况下,添加链接服务器然后执行查询会报如下信息: 原因:在64位的SQL Engine中已经不提供MSDAORA 的驱动了,可以使用Ora ...
- malloc、free的使用
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- 【 D3.js 高级系列 — 6.0 】 值域和颜色
在[入门 - 第 10 章]作了一张中国地图,其中各省份的颜色值都是随意赋值的.如果要将一些值反映在地图上,可以利用颜色的变化来表示值的变化. 1. 思路 例如,有值域的范围为: [10, 500] ...
- Android裁剪固定大小头像的功能
转载自: http://www.eoeandroid.com/thread-497277-1-1.html 效果很好,特意转载过来记录一下,加深一下印象. 效果就是 :中间的方框不动,可以拖动图片,选 ...
- 转载RabbitMQ入门(4)--路由
路由 (使用Java客户端) 在先前的指南中,我们建立了一个简单的日志系统.我们可以将我们的日志信息广播到多个接收者. 在这部分的指南中,我们将要往其中添加一个功能-让仅仅订阅一个消息的子集成为可能. ...