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().
随机推荐
- C++ 单元测试 Cpputest
参见:http://cpputest.github.io/ 1. CppUTest是一个C/C++单元测试框架,可以在C/C++项目中使命. 2. 第一个测试 新建一个cpp 文件,包含一个TEST_ ...
- HTML DOM随笔
编程接口 所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性. 方法是您能够执行的动作(比如添加或修改元素). 属性是您能够获取或设置的值(比如节点的名称或内容). getElemen ...
- Unity3D游戏引擎最详尽基础教程
第一节 加入重力 我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用 ...
- 调试WEB APP多设备浏览器
方法:adobe shadow \ opera远程调试\ weinre adobe shadow: 我们经常使用Firefox的firebug或者Chrome的开发人员工具进行Web调试页面,Jav ...
- Codeforces Round #196 (Div. 2)
A 题意:O(-1) 思路:排个序搞定. B 题意:O(-1) 思路:坑了我好久,这个框框水平垂直比例固定,分两种情况即可,不能旋转,我想多了,分了四种情况. C 题意:一列n个位置,让你填m个数,当 ...
- IOS第八天(7:UITableViewController新浪微博,cell 复用的简单写法优化和cell高度从模型中获取)
*********** #import "HMViewController.h" #import "HMStatus.h" #import "HMSt ...
- C# 路径
一.根目录 .// 或者直接给出文件名称,是找根目录的路径 如:path = "test.xml" 与 path = ".//test.xml"是一个意思 二. ...
- 一次与iptables有关的Openstack排错
先说下环境: 宿主机A(192.168.1.242)上运行着实例a(192.168.1.176), 宿主机B(192.168.1.56)上运行着实例b(192.168.1.50). 用户说从实例b上t ...
- LeetCode Flatten 2D Vector
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
- Java接口与实例化
看代码看到 public Runnable r = new Runnable() { @Override public void run() { ... } } 接口不能new ,不过可以生成一个匿名 ...