【Java实现】栈和队列就是这么简单

Java - 数据结构,栈 java虚拟机栈也是栈,就是JVM中的一块内存,也是符合栈的规则 – 先进后出规则方法区:存放类定义信息、字节码、常量等数据,在Sun HotSpot JVM中,这块也称为Perm Gen。堆:创建的对象信息将放入堆中,堆内部如何实现各虚拟机各不相同,对于Sun HotSpot JVM来说又分为Young Gen和Tenured Gen,更详细描述参见《[Java性能剖析]Sun JVM内存管理和垃圾回收 》 阅读详情

一、前言

上一篇已经讲过了链表【Java实现单向链表】了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列

如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够在评论下留言,让大家学习学习~

二、数据结构【栈】就是这么简单

2.1数据结构【栈】介绍

数据结构的栈长的是这个样子:

其实非常好理解,我们将栈可以看成一个箱子

  • 往箱子里面放东西叫做入栈
  • 往箱子里面取东西叫做出栈
  • 箱子的底部叫做栈底
  • 箱子的顶部叫做栈顶

说到栈的特性,肯定会有一句经典的言语来概括:先进后出(LIFO, Last In First Out)

  • 往箱子里边放苹果,箱子底部的苹果想要拿出来,得先把箱子顶部的苹果取走才行

2.2数据结构【栈】 代码实现

栈的分类有两种:

  • 静态栈(数组实现)
  • 动态栈(链表实现)

从上一篇写链表我就认知到我的算法是有多渣了,普通的单链表操作也能把我绕得晕晕的。

由于我的链表还不是很熟,栈又不是很难,那么我就用链表来创建动态栈了!

既然是用链表,我们还是把上一篇节点的代码拿过来吧:


public class Node {

    //数据域
    public int data;

    //指针域,指向下一个节点
    public Node next;

    public Node() {
    }

    public Node(int data) {
        this.data = data;
    }

    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }

}

要链表用来表示栈,这次会有两个指针:

  • 栈顶
  • 栈底

public class Stack {

    public Node stackTop;
    public Node stackBottom;

    public Stack(Node stackTop, Node stackBottom) {
        this.stackTop = stackTop;
        this.stackBottom = stackBottom;
    }

    public Stack() {
    }


}

2.2.1进栈

将原本栈顶指向的节点交由新节点来指向,栈顶指向新加入的节点



    /**
     * 进栈
     *
     * @param stack 栈
     * @param value 要进栈的元素
     */
    public static void pushStack(Stack stack, int value) {

        // 封装数据成节点
        Node newNode = new Node(value);


        // 栈顶本来指向的节点交由新节点来指向
        newNode.next = stack.stackTop;

        // 栈顶指针指向新节点
        stack.stackTop = newNode;

    }

2.2.2遍历栈

只要栈顶元素的指针不指向栈底,那么就一直输出遍历结果:


    /**
     * 遍历栈(只要栈顶指针不指向栈底指针,就一直输出)
     *
     * @param stack
     */
    public static void traverse(Stack stack) {
        Node stackTop = stack.stackTop;

        while (stackTop != stack.stackBottom) {

            System.out.println("关注公众号:Java3y:" + stackTop.data);

            stackTop = stackTop.next;
        }


    }

测试:


    public static void main(String[] args) {

        //初始化栈(无元素)
        Stack stack = new Stack(new Node(), new Node());

        //栈顶和栈尾是同一指向
        stack.stackBottom = stack.stackTop;

        //指向null
        stack.stackTop.next = null;


        //进栈
        pushStack(stack, 3);
        pushStack(stack, 4);
        pushStack(stack, 5);

        traverse(stack);

    }

结果:

这就符合了先进后出的特性了~

2.2.3判断该栈是否为空

很简单,只要栈顶和栈底是同一指向,那么该栈就为空


    /**
     * 判断该栈是否为空
     *
     * @param stack
     */
    public static void isEmpty(Stack stack) {
        if (stack.stackTop == stack.stackBottom) {

            System.out.println("关注公众号:Java3y---->该栈为空");
        } else {

            System.out.println("关注公众号:Java3y---->该栈不为空");

        }

    }

2.2.4出栈

  1. 在出栈之前看看该栈是否为空,不为空才出栈…
  2. 将栈顶的元素的指针(指向下一个节点)赋值给栈顶指针(完成出栈)
    /**
     * 出栈(将栈顶的指针指向下一个节点)
     * @param stack
     */
    public static void popStack(Stack stack) {

        // 栈不为空才能出栈
        if (!isEmpty(stack)) {

            //栈顶元素
            Node top = stack.stackTop;

            // 栈顶指针指向下一个节点
            stack.stackTop = top.next;

            System.out.println("关注公众号:Java3y---->出栈的元素是:" + top.data);

        }
    }

测试出栈:

多次出栈:

2.2.5清空栈

当时学C的时候需要释放内存资源,可是Java不用呀,所以栈顶指向栈底,就清空栈了


    /**
     * 清空栈
     * @param stack
     */
    public static void clearStack(Stack stack) {

        stack.stackTop = null;
        stack.stackBottom = stack.stackTop;
    }

三、数据结构【队列】就是这么简单

数据结构的队列长的是这个样子:

其实队列非常好理解,我们将队列可以看成小朋友排队

  • 队尾的小朋友到指定的地点了–>出队
  • 有新的小朋友加入了–>入队

相对于栈而言,队列的特性是:先进先出

  • 先排队的小朋友肯定能先打到饭!

队列也分成两种:

  • 静态队列(数组实现)
  • 动态队列(链表实现)

这次我就使用数组来实现静态队列了。值得注意的是:往往实现静态队列,我们都是做成循环队列

做成循环队列的好处是不浪费内存资源!

3.1数据结构【队列】 代码实现

这次我们使用的是数组来实现静态队列,因此我们可以这样设计:


public class Queue {


    //数组
    public int [] arrays;

    //指向第一个有效的元素
    public int front;

    //指向有效数据的下一个元素(即指向无效的数据)
    public int rear;

}

从上面的设计我们可以发现:rear并不指向最后一个有效的元素,在循环队列中这样设计是非常方便的!因为这样设计可以让我们分得清队头和队尾(不然循环队列不断入队或出队,位置是变化很快的)

由于我们是循环队列,所以front和rear值会经常变动,我们得把front和rear的值限定在一个范围内,不然会超出队列的长度的。

有这么一个算法:rear=(rear+1)%数组长度

  • 比如rear的下标是2,数组的长度是6,往后面移一位是3,那么rear = (rear+1) % 6,结果还是3

3.1.2初始化队列

此时队列为空,分配了6个长度给数组(只能装5个实际的数字,rear指向的是无效的位置的)


    public static void main(String[] args) {

        //初始化队列
        Queue queue = new Queue();

        queue.front = 0;
        queue.rear = 0;
        queue.arrays = new int[6];

    }

3.1.3判断队列是否满了

如果rear指针和front指针紧挨着,那么说明队列就满了



    /**
     * 判断队列是否满了,front和rear指针紧挨着,就是满了
     * @param queue
     * @return
     */
    public static boolean isFull(Queue queue) {
        if ((queue.rear + 1) % queue.arrays.length == queue.front) {

            System.out.println("关注公众号:Java3y--->此时队列满了!");
            return true;
        } else {
            System.out.println("关注公众号:Java3y--->此时队列没满了!");
            return false;
        }
    }

3.1.4入队

  1. 判断该队列是否满了
  2. 入队的值插入到队尾中(具体的位置就是rear指针的位置【再次声明:rear指向的是无效元素的位置】
  3. rear指针移动(再次指向无效的元素位置)

    /**
     * 入队
     *
     * @param queue
     */
    public static void enQueue(Queue queue,int value) {

        // 不是满的队列才能入队
        if (!isFull(queue)) {

            // 将新的元素插入到队尾中
            queue.arrays[queue.rear] = value;

            // rear节点移动到新的无效元素位置上
            queue.rear = (queue.rear + 1) % queue.arrays.length;
        }
    }

3.1.5遍历

只要front节点不指向rear节点,那么就可以一直输出


    /**
     * 遍历队列
     * @param queue
     *
     */
    public static void traverseQueue(Queue queue) {

        // front的位置
        int i = queue.front;

        while (i != queue.rear) {

            System.out.println("关注公众号:Java3y--->" + queue.arrays[i]);

            //移动front
            i = (i + 1) % queue.arrays.length;
        }

    }

队列没满时:

队列已满了就插入不了了(验证上面的方法是否正确):

3.1.6判断该队列是否为空

只要rear和front指针指向同一个位置,那该队列就是空的了


    /**
     * 判断队列是否空,front和rear指针相等,就是空了
     * @param queue
     * @return
     */
    public static boolean isEmpty(Queue queue) {
        if (queue.rear  == queue.front) {
            System.out.println("关注公众号:Java3y--->此时队列空的!");
            return true;
        } else {
            System.out.println("关注公众号:Java3y--->此时队列非空!");
            return false;
        }
    }

3.1.7出队

出队的逻辑也非常简单:

  1. 判断该队列是否为null
  2. 如果不为null,则出队,只要front指针往后面移就是出队了!


    /**
     * 出队
     *
     * @param queue
     */
    public static void outQueue(Queue queue) {

        //判断该队列是否为null
        if (!isEmpty(queue)) {


            //不为空才出队
            int value = queue.arrays[queue.front];
            System.out.println("关注公众号:Java3y--->出队的元素是:" + value);

            // front指针往后面移
            queue.front = (queue.front + 1) % queue.arrays.length;

        }


    }

结果:

四、总结

数据结构的栈和队列的应用非常非常的多,这里也只是最简单的入门,理解起来也不困难。

  • 栈:先进后出
  • 队列:先进先出

关于数据结构这方面我就到暂时到这里为止了,都简单的入个门,以后遇到更加复杂的再继续开新的文章来写~毕竟现在水平不够,也无法理解更深层次的东西~数据结构这东西是必备的,等到研究集合的时候还会来回顾它,或者遇到新的、复杂的也会继续学习….

想要更加深入数据结构的同学就得去翻阅相关的书籍咯~这仅仅是冰山一角

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

腾讯云服务器被攻击,带宽被占满的抗战日记 故事 时间:2021-08-23 地点:腾讯云服务器 事件:服务器内容被黑,修复后某人气不过,开始DDOS,占满服务器的带宽,导致网站访问非常缓慢。 杂记 根据腾讯云后台+宝塔后台,带宽被占满:(小垃圾水管没办法) 部分参考:记一次阿里云服务器ECS流出带宽占满的解决过程 https://blog.youkuaiyun.com/wangzhihao1994/article/details/99563456 首先是在云主机上使用远程连接访问到云主机,安装iftop工具 CentOS . 阅读详情

相关推荐

FPGA高速通信双核解析:CMAC与Interlaken硬核的实战对比

本文深入对比了FPGA中两大高速通信硬核CMAC与Interlaken的核心差异与应用场景。CMAC作为标准以太网接入方案,适用于网卡、交换机等需对外互联的场景;而Interlaken则以极低延迟和高效通道化能力,专为芯片间、板间裸数据高速传输设计。文章通过实战案例与性能指标分析,为FPGA高速通信方案选型提供清晰指南。

f9g0h的博客 845

深入理解Java中的栈(超详细)新手必看

栈(Stack)是一种常见的数据结构,具有后进先出(LIFO,Last In First Out)的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部变量、操作数栈等。在计算机科学中,栈的应用非常广泛,包括编程语言中的函数调用、内存分配以及表达式求值等领域。在Java编程语言中,栈也被广泛应用于方法调用和内存管理的过程中。双端栈(Double Ended Stack),也被称为双端队列(Deque),是一种支持在两端进行插入和删除操作的数据结构。

2201_75437633的博客 2万+

【vue看板】

大屏看板提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:代码量较多,看板中的。

weixin_46223284的博客 2772

Java数据结构-栈

栈

Vampire的博客 5641

ROS2通过ros2_socketcan实现CAN总线高效数据过滤与多节点通信

本文详细解析了ROS2通过ros2_socketcan实现CAN总线高效数据过滤与多节点通信的技术方案。文章重点探讨了CanFilterList的工作原理、多过滤器组合使用及动态配置策略,有效解决了工业应用中CAN总线数据过载问题,显著降低了CPU负载并提升了系统实时性。

n4o5p6q7r的博客 215

GD32F303实战:用定时器4触发ADC2+DMA,实现10ms精准采样1024点的完整流程

本文详细介绍了在GD32F303微控制器上使用Timer4触发ADC2配合DMA传输,实现10ms精准采样1024点的完整方案。从硬件架构设计、时钟树配置到定时器参数计算,提供了完整的工程实现流程和常见问题排查方法,适用于工业传感器监测等高实时性场景。

weixin_29194693的博客 433

Java数据结构01——栈

java java数据结构 栈

qq_64037280的博客 4385

A Super-Resolution Imaging Method for Forward-Looking Scanning Radar Based on Improved TV论文阅读

具体而言,作者提出了一种改进的总变差(Improved Total Variation, ITV)方法,通过引入。论文旨在解决前视扫描雷达(Forward-Looking Scanning Radar)超分辨率成像中传统。(Batch Processing),以增强图像边缘特征的保留能力,并提升计算效率。论文的核心创新点在于对传统TV正则化的邻域梯度计算进行扩展,提出。ITV剖面(图3d)在噪声下仍保持矩形边缘,仅存。​(公式10):实现稀疏约束。),抑制远端单元贡献。(幅度远低于目标)。

yangqoor的博客 1240

java中的栈

本文阐述了对栈数据结构的理解,展示了继承关系,针对Stack被弃置的问题展开了探讨,具体解释了被弃置的原因,如何替代,使用队列实现栈的算法以及在面试中如何看待Stack。

Archiea的博客 1万+

避开这些坑!Kaggle数据集下载常见问题及解决方案(含Header Editor插件配置)

本文针对Kaggle数据集下载过程中的常见难题,提供了系统性的解决方案。重点解决了验证码无法显示、API安装失败、密钥文件配置错误及下载命令执行问题,并详细介绍了使用Header Editor插件配置请求头以绕过验证码障碍的实战方法,帮助用户高效获取数据。

weixin_29043895的博客 301

OSCP-Challenge 2 - Relia

使用andrea:PasswordPassword_6登录远程桌面,在c盘根目录下发现一个计划任务的ps,文件,修改执行的exe位木马,获取到milana用户的反弹shell。,发现开放了一个8000端口,但是我们外部是访问不到的,它对应的页面是/var/www/internal/,这个目录下的文件我们是可以访问的,把这个文件打个包放到本地分析下。其中数据的可以直接连接mssql,但是端口是49965,不过在数据库中没发现什么可用的信息,但是可以修改密码直接进后台,这个可以先放放。

羽的博客 7768

栈和队列的Java实现_栈和队列的java简单实现

栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下:public class Stack{private Object[] data;//存储数据private int top;//表示栈顶元素publicStack(){data= new Object[100];//为了说明原理随意指定top =-1;}public synchronized void ...

weixin_34138192的博客 216

uniapp [全端兼容] - 最新详细实现拍摄视频录像并可播放预览视频,调起本机摄像头开启录像录制完毕后保存到本机临时存放,可对拍摄的视频进行压缩处理减少文件大小不损失画质,详解录制视频并读取播放!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,录视频,拍视频,拍摄录制视频后上传服务器,调起摄像头录视频并可预览,录视频上传,录像,uniapp录制视频并上传,录制视频并保存到本地设备,如何本地保存并播放预览,提供给用户观看MP4视频录像并上传到后端服务器完整功能源码,视频压缩,mp4文件,删除视频,录像后怎么预览,临时视频文件怎么减少压缩大小,视频压缩及上传,自己录视频并生成可播放的文件,录视频并能打开查看,视频压缩后上传,本机相册,录完怎么预

🏆 前端领域优质创作者 1万+

栈和队列的java简单实现

  栈:这是一个先进后出的数据结构,生活中类似的浏览器的返回上一页就可以利用此结构实现,代码如下: public class Stack<T> { private Object[] data;//存储数据 private int top;//表示栈顶元素 public Stack(){ data = new Object[100]...

weixin_34302561的博客 122

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java 队列和栈的简单实现

一.队列和栈 1.队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表 2.栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表 3.队列先进先出(FIFO),栈先进后出(FILO) 二.队列实现 package com.hmi.collection; import java.util.ArrayList; import java.util.Li...

hmi1024@163.com 200

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用Java实现简单的队列和栈(数组形式)

队列 这里用Java实现的是顺序队列,关于链表式队列和循环队列后期再写。 首先写一个接口文件。 public interface Queue_Interface { //插入 public void add_element(Object obj);//void表示无返回值 //删除 public Object pop(); //获取front数 public Object getfront(); ...

sgxylwz010的博客 440

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数组法实现简单的栈和队列的输入输出(Java)

栈:一种先入后出的数据结构 如何实现:定义“指针f”用于栈中数据的输入与输出 代码实现如下 public class Stack { private int [] arr=new int[10]; private int f=0; public void add(int value){ if(f==arr.length){ int [] brr=new int[arr.length]; for(int i=0;i

weixin_52350896的博客 597

java数据结构——栈和队列的简单实现

1、栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 public class Stack { private int[] arr; private int flag = 0; public Stack(int

Ez4Sterben的博客 791

java实现简单的队列和栈

栈: public class Stack { private Object[] data;//存储数据 private int top;//表示栈顶元素 public Stack(){ data = new Object[100];//为了说明原理随意指定 top =-1; } public synchronized vo

啊哈的博客 358

简单实现栈和循环队列(Java)

栈和队列的原理想必大家都懂,非常简单,一个后进先出,一个先进先出,话不多说,看代码 栈 public class Stack { private int[] arr; private int top;//栈顶元素下标 private int size; public Stack(int size) { this.size = size; arr = new int[size];...

weixin_43884418的博客 540

Java实现简单的栈和队列(底层基于数组)

栈:LIFO(后进先出) 队列:FIFO(先进先出) 栈的顺序存储结构实现-Java // 栈 public class MyStack { // 底层实现是一个数组 private long[] arr; private int top; // 默认的构造方法 public MyStack() { arr = new long[10]; top = -1; } // ...

wxx17353227396的博客 529

Java简单实现栈和队列(附代码和理论知识)

文章目录1、栈2、队列 数据结构之栈和队列 数组和链表是线性表的物理存储结构:即顺序存储和链式存储,栈和队列都属于线性表的逻辑存储结构。 上面这句话啥意思? 我们知道常见的数据结构中有一个线性表,线性表包括:数组、链表、栈、队列。 物理存储结构:数据在物理存储空间上选择集中存放还是分散存放,如数组(顺序存储结构)、链表(链式存储结构)。 逻辑存储结构:数据之间的逻辑关系,需要借助物理存储结构进行设计以体现出数据之间的逻辑关系。如:栈、队列、树、图。 上面的那些不利于理解的话我们可以简单理解为:物理存

qq_40346958的博客 701
上一篇: 栈和队列就是这么简单
下一篇: 十道简单算法题
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值