栈是一种“先去后出”的抽象的数据结构。例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先放进去的数据,最后才能得到。

栈不仅在生活中有很多例子,在计算机方面使用的更为频繁。如:大部分处理器运用基于栈的体系结构,当调用一个方法时,把他的返回地址和参数压入栈,当方法结束返回时,那些数据出栈。栈操作就嵌入在微处理器中。还有比如较老的计算器也是这样,他们不是输入带括号的算术表达式,而是把中间结果先存入栈中等等。

  栈原理图示:

栈代码实现(下面还有分隔符匹配例子的代码):

栈类实现:

package com.dxx.stack;

public class StackX {
private int maxSize;
private int[] stackArray;
private int top; //构造器中初始化栈的数组,并将栈定索引置为-1,表示栈为空。
public StackX(int maxSize) {
super();
this.maxSize = maxSize;
stackArray = new int[maxSize];
top = -1;
}
//判断栈是否为空,在出栈操作前都要先判断栈是否空,若为空,则不能出栈。
public boolean isEmpty(){
if(top == -1)
return true;
return false;
}
//判断栈是否已满,在入栈操作前都要先判断栈是否已满,若已满,则不能入栈。
public boolean isFull(){
if(top == maxSize-1)
return true;
return false;
}
//入栈
public void push(int num){
if(!isFull()){
stackArray[++top] = num;
}else {
System.out.println("栈已满,不能再进行入栈操作。");
}
}
//出栈
public int pop(){
if(!isEmpty()){
return stackArray[top--];
}else {
System.out.println("栈为空,不能获取栈定元素"); return 0;
}
}
//取栈顶元素
public int peek(){
if(!isEmpty()){
return stackArray[top];
}else {
System.out.println("栈为空,不能获取栈定元素"); return 0;
}
} }

主程序测试:

package com.dxx.stack;

public class StackMain {

    public static void main(String[] args) {
StackX stackX = new StackX(5);
stackX.peek();
stackX.push(0);
stackX.push(1);
stackX.push(2);
stackX.push(3);
stackX.push(4);
stackX.push(5);
System.out.println(stackX.pop());
System.out.println(stackX.pop());
System.out.println(stackX.pop());
} }

输出结果:

栈为空,不能获取栈定元素
栈已满,不能再进行入栈操作。
4
3
2

下面就是分隔符匹配的例子代码:

分析:

分隔符栈的类:

package com.dxx.stack;

public class BracketStackX {
private int maxSize;
private char[] stackArray;
private int top; //构造器中初始化栈的数组,并将栈定索引置为-1,表示栈为空。
public BracketStackX(int maxSize) {
super();
this.maxSize = maxSize;
stackArray = new char[maxSize];
top = -1;
}
//判断栈是否为空,在出栈操作前都要先判断栈是否空,若为空,则不能出栈。
public boolean isEmpty(){
if(top == -1)
return true;
return false;
}
//判断栈是否已满,在入栈操作前都要先判断栈是否已满,若已满,则不能入栈。
public boolean isFull(){
if(top == maxSize-1)
return true;
return false;
}
//入栈
public void push(char ch){
if(!isFull()){
stackArray[++top] = ch;
}else {
System.out.println("栈已满,不能再进行入栈操作。");
}
}
//出栈
public char pop(){
if(!isEmpty()){
return stackArray[top--];
}else {
System.out.println("栈为空,不能获取栈定元素"); return 0;
}
}
//取栈顶元素
public char peek(){
if(!isEmpty()){
return stackArray[top];
}else {
System.out.println("栈为空,不能获取栈定元素"); return 0;
}
}
}

字符串匹配检查类:

package com.dxx.stack;
//定义一个检查分隔符是否匹配的工具栏
public class BracketCheck {
private String input; public BracketCheck(String input) {
super();
this.input = input;
} public boolean chek(){
//先实例化有关分隔符的栈
BracketStackX stackX = new BracketStackX(input.length());
//依次比较input的字符,如果是左分隔符,就入栈,是右分隔符,就出栈与右分隔符匹配。
for(int i=0; i<input.length(); i++){
char ch = input.charAt(i);
switch(ch){
case '{':
case '[':
case '(':
stackX.push(ch);
break;
case ')':
case ']':
case '}':
char ch2 = stackX.pop();
if(ch==')'&&ch2=='(' ||ch==']'&&ch2=='[' ||ch=='}'&&ch2=='{'){
}else {
return false;
}
break;
}
}
if(!stackX.isEmpty()){
return false;
}
return true; } }

主程序测试:

package com.dxx.stack;

public class StackMain {

    public static void main(String[] args) {
BracketCheck bracketCheck = new BracketCheck("123{{[4444(3333)fff]ddddd}");
if(bracketCheck.chek())
System.out.println("匹配");
else
System.out.println("不匹配");
} }

结果为:不匹配。

大家有兴趣还可以练习一个单子逆序显示。

栈实现java的更多相关文章

  1. 剑指Offer——栈的java实现和栈的应用举例

    剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...

  2. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

  4. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. “全栈2019”Java多线程第三十三章:await与signal/signalAll

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. “全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. [Windows Phone]修改应用程序主题

    问题: Windows Phone模拟器默认情况下是黑色(Dark)主题,开发者往往都是在黑色主题下进行应用开发,加入自定义的颜色,样式等等,而当把手机操作系统主题设为白色(Light)主题之后会发现 ...

  2. Visual Leak Detector(vld)无法显示内存泄露文件名称与行号

    使用VLD測有没内存泄露的时候,出现(File and line number not available): (Function name unavailable) 查看VS控制台,发现 已载入&q ...

  3. HTML5 Canvas动画效果实现原理

    在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x ...

  4. c++一些语法模板

    函数模板特 template <class T> int compare(T v1,T v2) { if(v1<v2) return -1; else if(v1>v2) re ...

  5. ubuntu Linux 安装和首次使用

    1.ubuntu Linux 安装后切换到root账户,在默认情况下,系统安装过程中需要创建一个用户,切换到root账号命令如下:$ sudo -s -H输入 当前账户密码就可以切换到root.2.u ...

  6. cocos2dx手写js绑定C++

    这两天连续查阅了js绑定c++的非常多文章  , 有手动与自己主动两种方式 . 本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 . 以下总结一下手动绑定的实现过程 : 一共三步 ...

  7. Gradle 修改 Maven 仓库地址(转)

    近来迁移了一些项目到Android Studio,采用Gradle构建确实比原来的Ant方便许多.但是编译时下载依赖的网速又着实令人蛋疼不已. 如果能切换到国内的Maven镜像仓库,如开源中国的Mav ...

  8. 去掉windows文件末尾的^M: %s/\r//g

    去掉windows文件末尾的^M: %s/\r//g

  9. 微端 代码project as air 分享

    分享 ^_^ 1. 使用 air , as . 2. 微端下载和更新技术 成功上线棋牌游戏.它可用于传统的游戏开发. 地址: http://download.csdn.net/detail/stone ...

  10. discuz 插件开发 新手入门

    作为一个新手,目前也是刚刚玩转discuz的插件功能,好东西不敢独享,就拿出来大家一起分享入门的过程.现在网上很多关于discuz的插件教程都是很简单的教程,原因可能是这个东西是商业化的东西,本着分享 ...