栈实现java
栈是一种“先去后出”的抽象的数据结构。例如:我们在洗盘子的时候,洗完一个盘子,将其放在一摞盘子的最上面,但我们全部洗完后,要是有盘子时,我们会先从最上面的盘子开始使用,这种例子就像栈的数据结构一样,先放进去的数据,最后才能得到。
栈不仅在生活中有很多例子,在计算机方面使用的更为频繁。如:大部分处理器运用基于栈的体系结构,当调用一个方法时,把他的返回地址和参数压入栈,当方法结束返回时,那些数据出栈。栈操作就嵌入在微处理器中。还有比如较老的计算器也是这样,他们不是输入带括号的算术表达式,而是把中间结果先存入栈中等等。
栈原理图示:

栈代码实现(下面还有分隔符匹配例子的代码):
栈类实现:
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的更多相关文章
- 剑指Offer——栈的java实现和栈的应用举例
剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...
- “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十三章:await与signal/signalAll
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- oracle rac 在完成安装错误。
今天是2014.05.26,离别N继续使用长今博客.成交一直忙于最近.该条目加上家庭网络还没有缴纳会费,我开始变得不太安全.学习是一个需要冷静情绪.心脏的声音是. 由于改变笔记本,特别需要重新建立Ra ...
- form表单标签的enctype属性的作用
Enctype是指定将数据回发到server时浏览器使用的编码类型.其编码类型有下面三种 一. application/x-www-form-urlencoded 这是通过表单发送数据 ...
- 实例:怎样使用 Netty 下载文件
本实例主要參考的是官网的examples:点击这里 使用场景:client向Netty请求一个文件,Netty服务端下载指定位置文件到client. 本实例使用的是Http协议,当然,能够通过简单的改 ...
- 为了树莓派IIraspberrypi安装emacs+ecb+cedet+session+color-theme+cscope+linum
类似这篇文章写的不多,为了避免以后大家转来转去而忽略了写文章的时间,这些特别加上是2014年6月28日,省的对不上一些软件的版本号(下文中有些"最新"的说法就相应这个时间).假设转 ...
- HOG算子
原地址:http://blog.csdn.net/chlele0105/article/details/11991533 梯度直方图特征(HOG) 是一种对图像局部重叠区域的密集型描述符,它通过计算局 ...
- thinkphp中URL传参数的几种方式
在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法_ ...
- XSS分析及预防(转)
阅读目录 XSS的种类和特点 XSS预防 总结 XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.在WEB前端应用日益发展的今天,XSS漏 ...
- mysql基础:登录退出,修改用户密码,添加删除用户
今天刚开始学习mysql,最先接触用户管理,给大家分享下 注:mysql中命令的大小写都可以的 ==========登录退出相关=================== root@jack-deskto ...
- 单例模式 - 程序实现(Java)
我们知道单例模式,其实就是返回一个被调用类的实例. 在频繁的进行实例(Instance)创建过程,难免过多的进行new InstanceName():我们可以只通过调用一个方法解决. 在进行设计模式的 ...
- 安装IntelliJ IDEA JetGroovy(转)
JetGroovy是一个免费而且开源的专用于支持Groovy和Grails的IntelliJ IDEA插件.这个插件是由JetBrains公司自己开发的,对于Groovy语言和Web框架都提供了无以伦 ...