Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
接下篇:http://www.cnblogs.com/fuck1/p/5995857.html
堆栈的应用1:括号匹配算法
括号匹配问题
假设算术表达式中包含圆括号,方括号,和花括号三种类型。使用栈数据结构编写一个算法判断表达式中括号是否正确匹配,并设计一个主函数测试。
比如:{a+[b+(c*a)/(d-e)]} 正确
([a+b)-(c*e)]+{a+b} 错误
对于表达式中的括号是否匹配,不能仅仅通过统计左括号'('出现的次数和右括号')'出现的次数是否相等来实现,“a*)b+c(”这样的表达式中的括号显然是不匹配的。检验括号是否匹配最常见的方法是借助于栈这种数据结构,从左到右逐个字符扫描表达式,碰到左括号"("则压入栈中(push),碰到右括号")"则弹出栈顶元素(pop)如果栈为空,则匹配失败。字符串扫描完成后,如果栈为空,则匹配成功,否则匹配失败。
//-------------------------------------------------------------在这里虽然Java给出了Stack的类但是还是自定义
//下面是一个stack接口的定义
//栈接口
public interface Stack { // 入栈
public void push(Object obj) throws Exception; // 出栈
public Object pop() throws Exception; // 获得栈顶元素
public Object getTop() throws Exception; // 判断栈是否为空
public boolean isEmpty();
}
Stack interface
//顺序栈的具体实现,通过数组实现
//顺序栈
public class SequenceStack implements Stack {
Object[] stack; // 对象数组
final int defaultSize = 10; // 默认长度
int top;// 栈顶位置
int maxSize;// 最大长度
public SequenceStack() {
// 默认方法初始化
init(defaultSize);
}
// 显示调用方法初始化
public SequenceStack(int size) {
// 根据用户传入的参数进行初始化
init(size);
}
// 初始化方法
private void init(int size) {
this.maxSize = size;
top = 0;
stack = new Object[size];
}
// 入栈操作
@Override
public void push(Object obj) throws Exception {
// TODO Auto-generated method stub
// 判断栈是否已满
if (top == maxSize) {
throw new Exception("堆栈已满");
}
// 入栈
stack[top] = obj;
top++;
}
// 出栈
@Override
public Object pop() throws Exception {
// TODO Auto-generated method stub
// 判断栈是否为空
if (isEmpty()) {
throw new Exception("堆栈为空!");
}
// 因为在入栈之后默认将top值进行了++所以导致不指示当前位置
top--;
return stack[top];
}
// 获得栈顶元素
@Override
public Object getTop() throws Exception {
// TODO Auto-generated method stub
if (isEmpty()) {
throw new Exception("堆栈为空!!");
}
// 单纯获得栈顶元素
return stack[top - 1];
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return top == 0;
}
}
//获得栈的具体使用操作后,下面使用堆栈完成对括号匹配算法的使用:
import java.util.Scanner; //平衡符号算好,检查算数式的括号是否是正确的,小括号,中括号,大括号
public class Test {
public static void main(String[] args) throws Exception {
String str = "{a + [b + ( c * a ) / ( d * e)]}";
String str2 = "{a+(a*B)+[a-1] + }"; signCheck(str2);
} // 字符串检查
public static void signCheck(String str) throws Exception {
SequenceStack stack = new SequenceStack();
String[] arr = expToStringArray(str);
for (int i = 0; i < arr.length; i++) {
// 如果数组中有这三种左括号元素那么直接进行入栈操作
if (arr[i].equals("(") || arr[i].equals("[") || arr[i].equals("{")) {
stack.push(arr[i]);
} else if (arr[i].equals(")") && !stack.isEmpty()
&& stack.getTop().equals("(")) {
// 上面的if判断主要是当我们遇到右括号时,发现当前位于栈顶的是左括号,那么此时可以出栈了
stack.pop();
} else if (arr[i].equals(")") && !stack.isEmpty()
&& !stack.getTop().equals("(")) { System.out.println("左右括号匹配次序不成功");
return;
}
// 遇到中括号时
else if (arr[i].equals("]") && !stack.isEmpty()
&& stack.getTop().equals("[")) {
// 上面的if判断主要是当我们遇到右括号时,发现当前位于栈顶的是左括号,那么此时可以出栈了
stack.pop();
} else if (arr[i].equals("]") && !stack.isEmpty()
&& !stack.getTop().equals("[")) { System.out.println("左右括号匹配次序不成功");
return;
} // 大括号匹配
else if (arr[i].equals("}") && !stack.isEmpty()
&& stack.getTop().equals("{")) {
// 上面的if判断主要是当我们遇到右括号时,发现当前位于栈顶的是左括号,那么此时可以出栈了
stack.pop();
} else if (arr[i].equals("}") && !stack.isEmpty()
&& !stack.getTop().equals("{")) { System.out.println("左右括号匹配次序不成功");
return;
} // 右括号多于左括号的情况
else if (arr[i].equals(")") || arr[i].equals("]")
|| arr[i].equals("}") && stack.isEmpty()) {
System.out.println("右括号多于左括号");
return;
}
}
// 经历完一趟循环后如果堆栈不为空,那么左括号就多了
if (!stack.isEmpty()) {
System.out.println("左括号多于右括号");
} else {
System.out.println("匹配正确");
} } // 字符串转为字符串数组
public static String[] expToStringArray(String exp) {
// 字符串数组长度
int n = exp.length();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = exp.substring(i, i + 1);
} return arr;
}
}
Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现的更多相关文章
- java中内存结构及堆栈详解
一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...
- Java异常---获取异常的堆栈信息
Java 实例 - 获取异常的堆栈信息 Java 实例 以下实例演示了使用异常类的 printStack() 方法来获取堆栈信息: Main.java 文件 public class Main{ p ...
- 浅谈C/C++堆栈指引——C/C++堆栈
C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这种问题:什么时候数据存储在飞鸽传书堆栈(Stack)中.什么时候数据存储在堆(Heap)中.我们知道.局部变量是存储在堆栈中的.debu ...
- 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)
C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs ...
- 函数调用堆栈及活动记录 堆栈溢出 stack overflow
小结: 1.当被调函数返回主调函数时,被调函数的 活动记录-activation record / 堆栈帧-stack frame 被 弹出-popping 程序执行栈-program executi ...
- php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决
php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...
- JAVA代码:生成一个集合,自定义大小,100以内的随机整数
JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...
- JAVA - 如果hashMap的key是一个自定义的类,怎么办?
JAVA - 如果hashMap的key是一个自定义的类,怎么办? 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals().
随机推荐
- JAVA递归算法
1.什么是递归算法 递归算法就是直接或间接调用自己的算法 2.问题1:一列数的规则如下: 1.1.2.3.5.8.13.21.34 ,求第30位数是多少?使用递归实现 public class Fib ...
- javax.servlet.jsp cannot be resolved to a type
参考链接 :http://www.tuicool.com/articles/7Njmqy
- js 进度条,可实现结束和重新开始
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- lightetreeview
http://www.16css.com/menu/905.html 其他树形菜单:很好--1.http://www.cnblogs.com/zhhh/archive/2011/11/25/22637 ...
- Ubuntu 12.04 系统安装极点五笔输入法
习惯用五笔了,在Ubuntu下安装了下五笔: 下面就实际操作,安装极点五笔输入法! 在终端中执行如下命令: sudo wget http://www.xiit.cn/wp-content/upload ...
- 无法分配超出32(XXX)的MINEXTENTS报错的解决方法
今天在创建新表的时候,遇到该报错:ORA-01659 无法分配超出32(XXX)的MINEXTENTS 解决方法:修改表空间大小. 命令如下: ALTER DATABASE DATAFILE ''D: ...
- 20145334 第五次 java 实验报告
实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 我和20145306张文锦组队编程 http://www.cnblogs.com/besti145306/ ...
- Hash Table 的实现步骤是什么
什么是HashTable Hash Table 是计算机科学中很重要的一种数据结构,其时间复杂度为O(1),主要是通过把关键字Key 映射到数组中的一个位置来访问记录,所以速度相当快.映射函数称为 H ...
- Struts2基础学习总结
引用自:http://www.cnblogs.com/jbelial/archive/2012/05/10/2486886.html Struts 2是在WebWork2基础发展而来的. 注意:str ...
- [转]快速构建App界面的框架(●'◡'●) -----SalutJs
前言 卤煮在公司之初接触到的是一个微信APP应用.前端技术采用的是Backbone+zepto等小型JS类库.在项目开发之初,这类中小型的项目采用这两种库可以满足基本的需求.然而,随着迭代的更新和业务 ...