栈实现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多 ...
随机推荐
- poj 1611 The Suspects(并查集)
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 21598 Accepted: 10461 De ...
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...
- Linux正则表达式grep与egrep
grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt Linux正则表达式grep与egrep 正则表达式:它 ...
- git/github初级运用自如 (转)
三 . 设置用户信息 这一步不是很重要,貌似不设置也行,但github官方步骤中有,所以这里也提一下. 在git中设置用户名,邮箱 $ git config --global user.name &q ...
- Ubuntu14.04搭建android开发环境
一 下载ADT 官方下载地址:http://developer.android.com/sdk/index.html(须要FQ或者改动host) 二 解压 1 使用终端将下载的文件解压当前文件夹下: ...
- achieve aop through xml
The main way to achive AOP is deploying a xml file. Now a xml file is presented to be a explanation ...
- loj1236(数学)
传送门:Pairs Forming LCM 题意:题意:问符合 lcm(i,j)=n (1<=i<=j<=n,1<=n<=10^14) 的 (i,j) 有多少对. 分析: ...
- Java中WebService实例
Web Services是由企业公布的完毕其特定商务需求的在线应用服务,其它公司或应用软件可以通过Internet来訪问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描写 ...
- Linux Shell脚本入门--grep命令详解
grep简介<摘自鸟哥,并加以整理.> grep (global search regular expression(RE) and print out the line,全面搜索正则表达 ...
- 服务器编程入门(5)Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范. 工欲善其事,必先利其器,这篇主要来探 ...