Java数据结构之栈的线性结构详解

 更新时间:2021年08月05日 11:01:58   作者:Cbw  
从数据结构上看栈和队列都是线性表,不过是两种特殊的线性表,栈只允许在的一端进行插人或删除操作,而队列只允许在表的一端进行插人操作、而在另一端进行删除操作,这篇文章主要给大家介绍了关于Java数据结构之栈的线性结构的相关资料,需要的朋友可以参考下

一:栈

栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。

栈的基本操作分为push(入栈) 和 pop(出栈),前者相当于插入元素到表的末端(栈顶),后者相当于删除栈顶的元素。

二:栈的实现

public class LinearStack {
    /**
     * 栈的初始默认大小为10
     */
    private int size = 5;
    /**
     * 指向栈顶的数组下标
     */
    int top = -1;
    /**
     * 定义栈stack
     */
    private int[] stack;
    public LinearStack() {
        stack = new int[size];
    }
    /**
     * 判断栈满
     */
    public  boolean isFull() {
        boolean result = false;
        if(top == size - 1) {
            result = true;
        }
        return result;
    }
    /**
     * 入栈操作push
     */
    public  void push(int value) {
        /**
         * 如果栈满,拓展栈的容量
         */
        if(isFull())
            stack = expansionStack();
        top++;
        stack[top] = value;
    }
    /**
     * 出栈操作
     */
    public  int  pop() {
        if(top == -1)
            throw new RuntimeException("栈空!出栈失败");
        int result = stack[top] ;
        top--;
        return result;
    }
    /**
     * 扩充容量
     */
    public  int[] expansionStack() {
        size = size + 10;
        int[] stackTemp = new int[size];
        for (int i = 0; i < stack.length; i++) {
            stackTemp[i] = stack[i];
        }
        return stackTemp;
    }
    /**
     * 获取栈顶的元素
     */
    public int getTop() {
        return stack[top];
    }
    /**
     * 显示栈中的全部元素
     */
    public  String toString() {
        String str = "[";
        for (int i = 0; i <= top; i++) {
            if(i == top)
                str = str + stack[i] + "]";
            else
                str = str + stack[i] + ",";
        }
        return str;
    }
}

三:栈的测试

public class LinearStackTest {

    public static void main(String[] args) {
        LinearStack linearStack = new LinearStack();
        /**
         * 元素入栈
         */
        linearStack.push(1);
        linearStack.push(2);
        linearStack.push(3);
        linearStack.push(4);
        linearStack.push(5);
        /**
         * 栈满,显示栈中所有元素
         */
        System.out.println("0:arrayStack  " + linearStack.toString());
        /**
         * 再次入栈
         */
        linearStack.push(6);
        /**
         * 再次显示占中的所有元素
         */
        System.out.println("1:arrayStack:  " + linearStack.toString());
        /**
         * 获取栈顶元素
         */
        System.out.println("获取栈顶元素:stack[top] = " + linearStack.getTop()+"   top = " + linearStack.top);
        /**
         * 出栈
         */
        System.out.println("出栈:stack[top] = " + linearStack.pop()+"   top = " + linearStack.top);
        /**
         * 再次显示栈中的元素
         */
        System.out.println("2:arrayStack:  " + linearStack.toString());

    }
}

四:栈的应用(回文序列的判断)

public class LinearStackChar {
    private int size = 5;
    /**
     * 指向栈顶的数组下标
     */
    int top = -1;
    /**
     * 定义栈stack
     */
    private char[] stack;
    public LinearStackChar() {
        stack = new char[size];
    }
    /**
     * 判断栈满
     */
    public  boolean isFull() {
        boolean result = false;
        if(top == size - 1) {
            result = true;
        }
        return result;
    }
    /**
     * 入栈操作push
     */
    public void push(char value) {
        /**
         * 如果栈满,拓展栈的容量
         */
        if(isFull())
            stack = expansionStack();
        top++;
        stack[top] = value;
    }
    /**
     * 出栈操作
     */
    public  char  pop() {
        if(top == -1)
            throw new RuntimeException("栈空!出栈失败");
        char result = stack[top] ;
        top--;
        return result;
    }
    /**
     * 扩充容量
     */
    public char[] expansionStack() {
        size = size + 10;
        char[] stackTemp = new char[size];
        for (int i = 0; i < stack.length; i++) {
            stackTemp[i] = stack[i];
        }
        return stackTemp;
    }
    /**
     * 获取栈顶的元素
     */
    public char getTop() {
        return stack[top];
    }
    /**
     * 显示栈中的全部元素
     */
    public  String toString() {
        String str = "[";
        for (int i = 0; i <= top; i++) {
            if(i == top)
                str = str + stack[i] + "]";
            else
                str = str + stack[i] + ",";
        }
        return str;
    }
}
public class LinearStackCharTest {

    public static void main(String[] args) {
        /**
         * 判断一个字符串abcba是不是回文序列?
         * 思路:将字符串切割成为单个字符,存放在字符栈中;
         *      然后出栈,判断出栈后字符数组组成的字符串是否和原字符串相等;
         *      相等--回文序列
         *      不相等--不是回文序列
         */
        String str = "abcba";
        LinearStackChar linearStackChar = new LinearStackChar();
        //讲字符串切割,存放在栈中
        for (int i = 0; i < str.length(); i++) {
            linearStackChar.push(str.charAt(i));
        }
        //存放完成,显示栈中的元素
        System.out.println("stack = " + linearStackChar.toString());
        //出栈
        String result = "";
        int length = linearStackChar.top;
        System.out.println("top = " + length);

        for (int i = 0; i <= length; i++) {
            result  = result + String.valueOf(linearStackChar.pop());
        }
        //出栈组成的字符串
        System.out.println("result = " + result);
        //判断是否相等
        System.out.println("result = abcba?    " + (result.equals("abcba") ? true : false));

    }
}

总结

到此这篇关于Java数据结构之栈的线性结构的文章就介绍到这了,更多相关Java栈的线性结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring的事件发布与监听方式案例讲解

    Spring的事件发布与监听方式案例讲解

    今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节,所以下面这篇文章主要给大家介绍了关于SpringBoot事件发布和监听的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • java递归法求字符串逆序

    java递归法求字符串逆序

    这篇文章主要介绍了java递归法求字符串逆序,涉及java递归调用的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • Spring boot使用spring retry重试机制的方法示例

    Spring boot使用spring retry重试机制的方法示例

    这篇文章主要介绍了Spring boot使用spring retry重试机制的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 利用Java异常机制实现模拟借书系统

    利用Java异常机制实现模拟借书系统

    这篇文章主要给大家介绍了利用Java异常机制实现模拟借书系统的相关资料,文中先对java异常机制进行了简单介绍,而后通过示例代码介绍了java语言是如何实现一个控制台版的模拟借书系统,需要的朋友可以参考学习,一起来看看吧。
    2017-04-04
  • java之Thread不捕获异常默认处理逻辑

    java之Thread不捕获异常默认处理逻辑

    这篇文章主要介绍了java之Thread不捕获异常默认处理逻辑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Springboot 整合 Java DL4J 实现时尚穿搭推荐系统(实例代码)

    Springboot 整合 Java DL4J 实现时尚穿搭推荐系统(实例代码)

    本文介绍了如何使用SpringBoot和JavaDeeplearning4j框架搭建一个时尚穿搭推荐系统,文章详细阐述了系统的技术架构、数据集格式、Maven依赖配置、模型训练和预测代码实现,以及单元测试和预期输出结果
    2024-10-10
  • Java多线程中的CountDownLatch详细解读

    Java多线程中的CountDownLatch详细解读

    这篇文章主要介绍了Java多线程中的CountDownLatch详细解读,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待,用给定的计数 初始化 CountDownLatch,需要的朋友可以参考下
    2023-11-11
  • 如何用Java将数据库的数据生成pdf返回给前端用户下载

    如何用Java将数据库的数据生成pdf返回给前端用户下载

    本文详细介绍了使用SpringBoot、iText库、MyBatis等技术从数据库中选取数据并生成PDF文件的后端处理流程,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • Java中弱引用和软引用的区别以及虚引用和强引用介绍

    Java中弱引用和软引用的区别以及虚引用和强引用介绍

    很早Java API就添加了弱引用(WeakReference)和软引用(SoftReference),但并不是所有的程序员都熟悉这两个概念
    2014-04-04
  • MyBatis逆向工程基本操作及代码实例

    MyBatis逆向工程基本操作及代码实例

    这篇文章主要介绍了MyBatis逆向工程基本操作及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07

最新评论