栈实现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多 ...
随机推荐
- 例3.1 猜猜数据结构 UVa11995
1.标题叙述性说明:点击打开链接 2.解题思路:据来推測一种可能的数据结构,备选答案有"栈,队列.优先队列".结果也可能都不是或者不确定. STL中已经有这三种数据结构了,因此直接 ...
- codeforces 598B Queries on a String
题目链接:http://codeforces.com/problemset/problem/598/B 题目分类:字符串 题意:给定一个串,然后n次旋转,每次给l,r,k,表示区间l到r的字符进行k次 ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- The mmap module
The mmap module The mmap module (New in 2.0) This module provides an interface to the operating syst ...
- birt报表报错, There is no report design object available.org.eclipse.birt.report.exception.ViewerExcepti
报错信息例如以下: - There is no report design object available. org.eclipse.birt.report.exception.ViewerExce ...
- copy算法
copy------强化效率无所不用其极 copy(first,last,result)算法可将输入区间[first,last)内的元素拷贝到输出区间[result,result+(last-f ...
- jQuery中的getJSON()
json文件是一种轻量级的数据交互格式.一般在jQuery中使用getJSON()方法读取. $.getJSON(url,[data],[callback]) url:json文件地址 data:可选 ...
- 【译】ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解
原文:[译]ASP.NET MVC 5 教程 - 11:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一下自动生成的 Details 和Delete 方法. Details ...
- Python-Tkinter的Entry详解
#Tkinter教程之Entry篇 #Entry用来输入单行文本 '''1.第一个Entry程序''' from Tkinter import * root = Tk() Entry(root,tex ...
- 22个值得收藏的android开源码-UI篇
本文介绍了android开发人员中比較热门的开源码,这些代码绝大多数能够直接应用到项目中. FileBrowserView 一个强大的文件选择控件.界面比較美丽,使用也非常easy. 特点:能够自己定 ...