出门一笑, “栈” 落江横 (Java篇)

news2024/11/18 14:35:27

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

前言

说完数据结构的链表小专题,小编今天带来了我们这节非常有意思的 一种非常有意思的数据结构,实不相蛮,栈也是我们线性表中的一种结构哦 💥 💥 💥

目录

  1. 栈的初识
  2. Stack 类
  3. 栈的实现

请添加图片描述

一. 栈的初识

1. 栈的简介

栈:一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作。 进行 数据插入和删除操作的一端 称为栈顶 ,另一端称为栈底。栈中的数据元素遵守 后进先出 LIFO(Last In First Out)的原则。

而利用我们的 对数据操作时

我们主要有两种方式

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在 栈顶
出栈:栈的删除操作叫做 出栈 。出数据在栈顶

在这里插入图片描述

鱼式疯言

我们可以贴近生活去理解我们的

压入子弹和出子弹的时候,就是栈的 出栈和入栈
在这里插入图片描述
羽毛球入球桶和出球桶, 就是栈的 出栈和入栈
在这里插入图片描述

二. Stack 类

1.Stack 的简介

在我们的Java的数据结构的集合类中, 内部就提供了那么一种 的类

在这里插入图片描述

我们就成为 Stack 类,而这个类就实现了我们 栈的所需要的功能

2. Stack 的使用

<1>. 入栈

class Test {
    public static void main(String[] args) {
        Stack<Integer> s=new Stack<>();
        s.push(1);
        s.push(2);
        s.push(3);
    }
}

在这里插入图片描述

无论怎么存放,都是 先存放的放栈底,后存放的放栈顶

<2>. 出栈

class Test {
    public static void main(String[] args) {
        Stack<Integer> s=new Stack<>();
        
        // 先在栈顶入栈
        s.push(1);
        s.push(2);
        s.push(3);
        
        // 然后在栈底出栈
        System.out.println(s.pop());
        System.out.println(s.pop());
    }
}

在这里插入图片描述

出栈也如此,放在 栈顶的元素先出,栈底的元素后出 ,也就意味着 先入后出

<3>. 查栈

class Test {
    public static void main(String[] args) {
        Stack<Integer> s=new Stack<>();

        // 先在栈顶入栈
        s.push(1);
        s.push(2);
        s.push(3);

        // 然后在栈底出栈
        System.out.println(s.pop());  // 3
        System.out.println(s.pop());  // 2
        
        // 查看当前栈顶元素
        
        System.out.println(s.peek());  // 1
        System.out.println(s.peek());  // 1
    }
}

在这里插入图片描述

最终呈现出来的效果是一直打印 栈顶 的元素

故查栈时,只能查看当前 栈顶元素

<4>栈的大小以及是否为空

栈的大小

class Test {
    public static void main(String[] args) {
        Stack<Integer> s=new Stack<>();


        // 先在栈顶入栈
        s.push(1);
        s.push(2);
        s.push(3);

        System.out.println("=========== 栈的大小 ======");
        System.out.println(s.size());
    }
}

在这里插入图片描述

  • 根据返回值的数字来判断栈中大小

栈是否为空

class Test {
    public static void main(String[] args) {
        Stack<Integer> s=new Stack<>();


        // 先在栈顶入栈
        s.push(1);
        s.push(2);
        s.push(3);

        System.out.println("=========== 栈的大小 ======");
        System.out.println(s.size());


        System.out.println("========栈是否为空=========");
        if (s.empty()) {
            System.out.println("该栈为空!");
        } else {
            System.out.println("该栈不为空!");
        }
    }
}

在这里插入图片描述

根据返回的布尔类型来判断栈是否为空

鱼式疯言

  • 返回 true 说明为
  • 返回 false 说明 不为空

以上是我们栈的主要功能

可能有一些碎片化的功能小编可能未提及,小编个人认为不是很重要,小伙伴们只要掌握以上Stack 的 4 种功能 即可

竟然是程序员,肯定少不了实操的嘛,下面就让小编带着友友们来实现我们的 吧 💖 💖 💖

三. 栈的实现

在这里插入图片描述

1. 构建栈的底层

说到栈的先入后出的特点, 我们不得不想起我们之前学过的顺序表和链表

小伙伴们是不是觉得很相似呢,入栈不就相当于 尾插 么,出栈不就相当于 尾删

竟然两者都能实现,那么我们该选择顺序表还是链表好呢,小编认为自然是选择顺序表更优一点

这是为啥呢 ?

因为啊我们的顺序表本质上是 数组

而我们的数组本身就是一块连续的空间,所以不管我们尾插还是尾删数据时,自然选择我们的顺序表更恰当咯 😁 😁 😁

public class MyStack implements IStack{


    // 定义一个栈
   public int []elem;

    public MyStack() {
        this.usesize = 0;

        this.elem =new int[SIZEMAX];
    }


    // 现有栈元素大小
    public  int usesize;
}

2. 入栈

请添加图片描述

// 入栈
    @Override
    public void push(int val) {

        if (isFull()) {
            this.elem= Arrays.copyOf(elem,2*elem.length);
        }

        elem[usesize]=val;
        usesize++;
    }

    // 检查栈是否满

    private boolean isFull() {
        return usesize==size();
    }

在这里插入图片描述

入栈是容易,但小伙伴们可不要掉以轻心哦,当我们入栈时,一定要注意数组的空间是否足够

如果不够一定要及时的 扩容

具体扩容细节可以参考的我们 Java篇 的顺序表哦

顺序表详解链接

3. 出栈

请添加图片描述


   // 去除栈顶元素
    @Override
    public int pop() {
        if (isEmpty()) {
            return -1;
        }

        int ret=elem[usesize-1];
//         elem[usesize]=null;
        usesize--;
        return ret;
    }
    
    //检查是否空
    @Override
    public boolean isEmpty() {
        return usesize==0;
    }

在这里插入图片描述

首先我们得判断该栈元素是否为 ,这时我们就可以用到我们自己写的 isEmpty() 方法 啦。如果成立就返回 -1

然后出栈就没有我们入栈那么细节的需要考虑增容的情况啦,我们只需要把 有效元素大小减少一位 即可 💖 💖 💖

鱼式疯言

但要注意一点哦,如果该数据类型是 引用数据类型 就需要 置空

// elem[usesize]=null;

4. 查栈


// 喵一眼栈顶元素
@Override
public int peek() {
    if (isEmpty()) {
        return -1;
    }


    return elem[usesize-1];
}


    //检查是否空
    @Override
    public boolean isEmpty() {
        return usesize==0;
    }

在这里插入图片描述

peek() 方法中, 我们只需要返回当前 栈顶 的元素即可。

5.栈的大小以及是否为空

//检查是否空
@Override
public boolean isEmpty() {
    return usesize==0;
}


// 返回栈的大小
@Override
public int size() {
      return usesize;
}

在这里插入图片描述

在这里插入图片描述

检查栈是否为空只需要是否等于 0 即可

6. 程序逻辑与接口代码展示

package stack;


public interface IStack {

     int SIZEMAX=10;

    // 入栈
    void push(int val);

    // 出栈
    int pop();

    // 喵栈
    int peek();




    // 是否空
    boolean isEmpty();

    // 栈的大小
    int size();

}

package stack;

public class TestStack {
    public static void main(String[] args) {
        MyStack ms=new MyStack();

        // 入栈
        ms.push(1);
        ms.push(2);
        ms.push(3);
        ms.push(4);
        ms.push(5);


        System.out.println("======出栈元素======");
        // 出栈
        // 先出栈顶
        System.out.println(ms.pop());  // 5
        System.out.println(ms.pop());  // 4
        System.out.println(ms.pop()); // 3



        System.out.println("=======查栈元素==========");
        // 看栈顶
        System.out.println(ms.peek());
        System.out.println(ms.peek());


        System.out.println("========查栈大小========");
        // 栈的大小
        System.out.println(ms.size);

        System.out.println("=======查栈是否为空=======");

        if (ms.isEmpty()) {
            System.out.println("MyStack 为空!");
        } else {
            System.out.println("MyStack 不为空!");
        }

    }
}

鱼式疯言

这里我们的数据类型是以 int 的整型数据类型。但我们是可以给我们的数组添加泛型来实现我们 多样数据类型 的栈,还是利用我们的 顺序表 的优化来是可以实现哦 (只需要改成泛型即可)

顺序表的优化详解链接

总结

  • 栈的初识: 我们认识了栈是什么,以及栈的特征和功能
  • Stack 类: Java内部用了我们 Stack 这个类 来实现我们出入栈的各种功能
  • 栈的实现: 我们动手实现了栈的主要的功能和以及说明了实现的细节要点

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——组合模式08

组合模式&#xff1a;把类似对象或方法组合成结构为树状的设计思路。 例如部门之间的关系。 设计模式&#xff0c;一定要敲代码理解 抽象组件 /*** author ggbond* date 2024年04月06日 08:54* 部门有&#xff1a;二级部门&#xff08;下面管三级部门&#xff09; 三级部门 &a…

12.自定义的多帧缓存架构

1.简介 在数字图像处理中&#xff0c;经常需要用到的一个架构就是多帧缓存。视频流中需要用到多帧缓存来防止帧撕裂现象&#xff0c;图像处理中也需要帧差法来做移动目标检测。因此一个多帧缓存架构在图像系统的设计中是十分重要的。 2.多帧缓存 在视频流中&#xff0c;通常不…

感染了后缀为.jayy勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 在当今数字化的世界中&#xff0c;网络安全已经成为了每个人都需要关注的重要议题。而勒索病毒作为网络安全领域中的一大威胁&#xff0c;不断地演变和升级&#xff0c;给个人和组织带来了严重的损失和困扰。近期&#xff0c;一种名为.jayy的勒索病毒引起了广…

java数据结构与算法刷题-----LeetCode415. 字符串相加

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 模拟小学加法运算 模拟小学加法运算 解题思路&#xff1a;时间复…

【Java设计模式】创建型——工厂方法模式

目录 背景/问题解决方案思路方案 图解简单工厂模式/静态工厂模式工厂方法模式 代码示例&#xff1a;图形工厂意图主要解决何时使用如何解决关键代码 工厂模式的优点工厂模式的缺点使用场景注意事项 背景/问题 在软件设计中&#xff0c;我们经常遇到需要创建不同类型对象的情况…

如何理解模板?

文章目录 1. 泛型编程2.函数模板2.1函数模板概念2.1函数模板格式2.3函数模板的原理2.4函数模板的实例化2.5模板参数的匹配原则 3.类模板3.1类模板的定义格式3.2类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right)…

Vue中如何使用Tailwind CSS样式?多次引用不成功?具体步骤怎么做?

一、安装Tailwind CSS和依赖 在你的Vue项目中安装Tailwind CSS及其依赖。你可以使用npm或yarn来安装。 npm install tailwindcsslatest postcsslatest autoprefixerlatest # 或者yarn add tailwindcsslatest postcsslatest autoprefixerlatest 二、初始化Tailwind CSS np…

【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现

目录 前言 使用场景 1.单个方法层面 2.类级别使用 3.指定异常回滚 4.跨方法调用事务管理 5.只读事务 ​ 6.设置超时时间&#xff0c;超时则自动回滚 7.隔离级别设置 章末 前言 小伙伴们大家好&#xff0c;ACID&#xff08;原子性&#xff0c;一致性&#xff0c;隔离…

【WEEK6】 【DAY1】DQL查询数据-第一部分【中文版】

2024.4.1 Monday 目录 4.DQL查询数据&#xff08;重点&#xff01;&#xff09;4.1.Data Query Language查询数据语言4.2.SELECT4.2.1.语法4.2.2.实践4.2.2.1.查询字段 SELECT 字段/* FROM 表查询全部的某某查询指定字段 4.2.2.2.给查询结果或者查询的这个表起别名&#xff08…

2024免费Mac苹果解压压缩包软件BetterZip5

在2024年&#xff0c;对于Mac电脑用户来说&#xff0c;如果你想要无需解压就能快速查看压缩文档的内容&#xff0c;BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压&#xff0c;如zip、rar、7z、tar等&#xff0c;还具备丰富的功能和设置&#xff0c;包括预览…

【异常解决】Non-terminating decimal expansion; no exact representable decimal result.

Non-terminating decimal expansion; no exact representable decimal result. 一、背景描述二、异常原因三、解决方案四、RoundingMode&#xff08;舍入模式&#xff09;4.1、ROUND_UP4.2、ROUND_DOWN4.3、ROUND_CEILING4.4、ROUND_FLOOR4.5、ROUND_HALF_UP&#xff08;四舍五…

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng&#xff0c;允许从任何主机 % 连接&#xff0c;并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

ChromeOS 中自启动 Fcitx5 和托盘 stalonetray

ChromeOS 更新的飞快&#xff0c;旧文章的方法也老是不好用&#xff0c;找遍了也没找到很好的可以开机自启动 Linux VM 和输入法、托盘的方法。 研究了一下&#xff08;不&#xff0c;是很久&#xff09;&#xff0c;终于找到个丑陋的实现。 方法基于 ChromeOS 123.0.6312.94…

域名应该如何实名?域名应该如何备案?域名如何解析到服务器

大家好欢迎来到易极赞&#xff0c;今天我们来跟大家聊一下“域名应该如何实名以及备案”这个话题。 域名实名认证是验证域名所有者身份的过程&#xff0c;以确保域名的合法性&#xff0c;通常需要登录到域名服务商后台&#xff0c;进行域名的注册&#xff0c;注册后创建域名模…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁&#xff0c;悲观锁 从性能上分为乐观锁&#xff08;版本对比,版本一致就更新&#xff0c;不一致就不更新或CAS机制&#xff09;和悲观锁&#xff08;锁住资源等待&#xff09;&#xff0c;乐观锁适合读比较多的场景&#x…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

springboot之mybatisPlus多表查询及分页查询

文章目录 一、多表查询二、mybatis-plus条件查询三、分页查询 一、多表查询 可能会用到的注解 这里的场景是&#xff0c;查询每个用户及其所有的订单。就是查询你的id号的同时&#xff0c;把你所有的历史订单信息都拉出来。 表结构这样 CREATE TABLE User ( id INT PRIMARY…

Pytorch数据结构:GPU加速

文章目录 一、GPU加速1. 检查GPU可用性&#xff1a;2. GPU不可用需要具体查看问题3. 指定设备4.将张量和模型转移到GPU5.执行计算&#xff1a;6.将结果转移回CPU 二、转移原理1. 数据和模型的存储2. 数据传输3. 计算执行4. 设备管理5.小结 三、to方法的参数类型 一、GPU加速 .…

Jetson nano部署Yolov8 安装Archiconda3+创建pytorch环境(详细教程+错误解决)

由于jetson nano 是aarch64架构&#xff0c;Anaconda官方不支持aarch64架构&#xff0c;所以有了一个叫“Archiconda”&#xff0c;其目的就是将conda移植到aarch64平台上 一. 下载地址Releases Archiconda/build-tools GitHub 然后安装archiconda bash Archiconda3-0.2.3…