栈实现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多 ...
随机推荐
- [置顶] Bug 11775332 - cluvfy fails with PRVF-5636 with DNS response timeout error [ID 11775332.8]
Bug 11775332 cluvfy fails with PRVF-5636 withDNS response timeout error but error text is not clear ...
- poj 2513 连接火柴 字典树+欧拉通路 好题
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27134 Accepted: 7186 ...
- 算法起步之Bellman-Ford算法
原文:算法起步之Bellman-Ford算法 从这篇开始我们开始介绍单源最短路径算法,他是图算法之一,我们前面说的贪心,图的遍历,动态规划都是他的基础,单源最短路径其实说的就是图中节点到节点的最短路径 ...
- Eclipse 每次打开workspace目录记录位置?
E:\eclipse_j2ee eclipse安装根目录 在这个文件下: E:\eclipse_j2ee\configuration\.settings\org.eclipse.ui.ide.pref ...
- 为什么国外程序员爱用苹果Mac电脑?(转)
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒.那么为什么专业人士也对 Mac 情有独钟呢?从个人使用 ...
- POJ 1122 FDNY to the Rescue!
给出某些交叉点的距离,-1 表示无法到达. 然后给出火灾发生点 和 附近的消防局位置. 排列消防局 的 时间 与路径. 反向建图,以火灾出发点为起点做一次SPFA. #include<cstd ...
- Web Api 2(Cors)Ajax跨域访问
支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Ang ...
- Linux lamp环境编译安装
1.安装准备: 1)httpd-2.0.52.tar.gz 2)mysql-4.1.12.tar.gz 3)libxml2-2.6.27.tar 4)freetype-2.1.10.tar 5)gd- ...
- C#应用Newtonsoft.Json.dll,控制json的时间格式
原文:C#应用Newtonsoft.Json.dll,控制json的时间格式 var aIsoDateTimeConverter = new IsoDateTimeConverter();aIsoDa ...
- MySQL 全角转换为半角
序言: 用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...