接下篇: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实现的更多相关文章

  1. java中内存结构及堆栈详解

    一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...

  2. Java异常---获取异常的堆栈信息

    Java 实例 - 获取异常的堆栈信息  Java 实例 以下实例演示了使用异常类的 printStack() 方法来获取堆栈信息: Main.java 文件 public class Main{ p ...

  3. 浅谈C/C++堆栈指引——C/C++堆栈

    C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这种问题:什么时候数据存储在飞鸽传书堆栈(Stack)中.什么时候数据存储在堆(Heap)中.我们知道.局部变量是存储在堆栈中的.debu ...

  4. 浅谈C/C++堆栈指引——C/C++堆栈很强大(绝美)

    C/C++堆栈指引 Binhua Liu 前言 我们经常会讨论这样的问题:什么时候数据存储在飞鸽传书堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:deb ...

  5. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener

    atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs   ...

  6. 函数调用堆栈及活动记录 堆栈溢出 stack overflow

    小结: 1.当被调函数返回主调函数时,被调函数的 活动记录-activation record / 堆栈帧-stack frame 被 弹出-popping 程序执行栈-program executi ...

  7. php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决

    php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...

  8. JAVA代码:生成一个集合,自定义大小,100以内的随机整数

    JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...

  9. JAVA - 如果hashMap的key是一个自定义的类,怎么办?

    JAVA - 如果hashMap的key是一个自定义的类,怎么办? 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals().

随机推荐

  1. C++ 单元测试 Cpputest

    参见:http://cpputest.github.io/ 1. CppUTest是一个C/C++单元测试框架,可以在C/C++项目中使命. 2. 第一个测试 新建一个cpp 文件,包含一个TEST_ ...

  2. HTML DOM随笔

    编程接口 所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性. 方法是您能够执行的动作(比如添加或修改元素). 属性是您能够获取或设置的值(比如节点的名称或内容). getElemen ...

  3. Unity3D游戏引擎最详尽基础教程

    第一节 加入重力 我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用 ...

  4. 调试WEB APP多设备浏览器

    方法:adobe shadow  \ opera远程调试\ weinre adobe shadow: 我们经常使用Firefox的firebug或者Chrome的开发人员工具进行Web调试页面,Jav ...

  5. Codeforces Round #196 (Div. 2)

    A 题意:O(-1) 思路:排个序搞定. B 题意:O(-1) 思路:坑了我好久,这个框框水平垂直比例固定,分两种情况即可,不能旋转,我想多了,分了四种情况. C 题意:一列n个位置,让你填m个数,当 ...

  6. IOS第八天(7:UITableViewController新浪微博,cell 复用的简单写法优化和cell高度从模型中获取)

    *********** #import "HMViewController.h" #import "HMStatus.h" #import "HMSt ...

  7. C# 路径

    一.根目录 .// 或者直接给出文件名称,是找根目录的路径 如:path = "test.xml" 与 path = ".//test.xml"是一个意思 二. ...

  8. 一次与iptables有关的Openstack排错

    先说下环境: 宿主机A(192.168.1.242)上运行着实例a(192.168.1.176), 宿主机B(192.168.1.56)上运行着实例b(192.168.1.50). 用户说从实例b上t ...

  9. LeetCode Flatten 2D Vector

    原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...

  10. Java接口与实例化

    看代码看到 public Runnable r = new Runnable() { @Override public void run() { ... } } 接口不能new ,不过可以生成一个匿名 ...