接下篇: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. django1.9 创建数据表

    1.在setting.py 中注册app: 2.编写models.py 文件创建表结构: (生成的表默认是: app名称_定义的表面  ) 3.执行命令: python manage.py check ...

  2. Linux下安装PHP

    从php官网下载好需要php的压缩包,我下的是5.5.37版, 解压:# tar -xvf php-5.5.37.tar.gz 移至解压出的文件夹:# cd php-5.5.37 检查安装环境:# . ...

  3. ZK 代码自动提示

    1.设置xsd 打开eclipse,Window-Preference,进行如下设置: 2.创建zul文件 (1)打开File—New—Other窗口,新建XML File文件: (2)选择新建文件所 ...

  4. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  5. 使用xtrbackup 热备MySQL数据库 以及恢复和自动删除脚本

    直接上脚本 热备(全备) #!/bin/bash user='root' passwd='123456' my_config='/etc/my.cnf' #mysql configure log=fu ...

  6. php 执行的目录到新的 directory 目录中

    chdir : 改变目录. dir : 目录类别类. closedir : 关闭目录 handle. opendir : 打开目录 handle. readdir : 读取目录 handle. rew ...

  7. easyUI datagrid笔记

    easyUI datagrid 简单使用与注意细节 背景: 业余爱好,使用了一下easyUI的搜索框与数据表格,并把两者整合起来进行使用. 使用前提(引入需要的js and css): <lin ...

  8. Objective-C基础语法快速入门

    Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...

  9. DataSet, BindingSource, BindingNavigator Relationship

    Multiple Bindings caused dataBing weird???? Text.DataBindings.Add(new Binding("Text", bs1, ...

  10. PHP文件操作系统----主要的文件操作函数

    一.文件操作系统概述 1.概述: php中的文件操作系统主要是对文件和目录的操作.文件在windows系统下分为3种不同:文件.目录.未知,在linux/unix系统下分为7种不同:block.cha ...