栈实现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("不匹配");
    }

}

结果为:不匹配。

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

时间: 2024-10-07 09:06:41

栈实现java的相关文章

栈的Java实现--链栈

栈的Java实现--链栈 链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易. 链栈的基本结构: 链栈的入栈操作: 让top引用指向新的节点,新节点的next指向原来的top 记录栈内元素个数的size+1 链栈的出栈操作: top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用 记录栈内元素个数的size-1 链栈的Java实现代码: package com.liuhao.DataStr

两个栈实现一个队列以及两个队列实现一个栈(Java)

两个栈实现一个队列 import java.util.Stack; public class Demo07 { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.push(node); } public int pop() { if(stack2.size

“全栈2019”Java第一章:安装JDK11(Mac)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 文章原文链接 "全栈2019"Java第一章:安装JDK11(Mac) 下一章 "全栈2019"Java第二章:安装JDK11(Windows) 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全栈工程师学习计划 关

“全栈2019”Java第五章:IntelliJ IDEA代码自动提示

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第五章:IntelliJ IDEA代码自动提示 下一章 "全栈2019"Java第六章:注释 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&quo

“全栈2019”Java第七章:IntelliJ IDEA注释快捷键

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第七章:IntelliJ IDEA注释快捷键 下一章 "全栈2019"Java第八章:IntelliJ IDEA设置注释不显示在行首 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,

“全栈2019”Java第八章:IntelliJ IDEA设置注释不显示在行首

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八章:IntelliJ IDEA设置注释不显示在行首 下一章 "全栈2019"Java第九章:解释第一个程序 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Jav

“全栈2019”Java第九章:解释第一个程序

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九章:解释第一个程序 下一章 "全栈2019"Java第十章:关键字 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全栈工程师学习

“全栈2019”Java第十章:关键字

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第十章:关键字 下一章 "全栈2019"Java第十一章:标识符 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组". 全栈工程师学习计划

“全栈2019”Java第十六章:下划线在数字中的意义

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第十六章:下划线在数字中的意义 下一章 "全栈2019"Java第十七章:赋值运算符和算术运算符 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&q

“全栈2019”Java第十七章:赋值运算符和算术运算符

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第十七章:赋值运算符和算术运算符 下一章 "全栈2019"Java第十八章:一元运算符 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组".