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

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

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

前言

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

目录

  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 这个类 来实现我们出入栈的各种功能
  • 栈的实现: 我们动手实现了栈的主要的功能和以及说明了实现的细节要点

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nest状态码HttpCode

写法 默认情况下&#xff0c;响应的状态码总是默认为 200&#xff0c;除了 POST 请求&#xff08;默认响应状态码为 201&#xff09;&#xff0c;可以通过在处理函数外添加 HttpCode&#xff08;…&#xff09; 装饰器来轻松更改状态码 src/cats/cats.controller.ts import {…

springboot和vue前后端交互概况

Spring Boot 和 Vue.js 是当前流行的开发技术栈&#xff0c;前者主要用于构建后端服务&#xff0c;后者则主要用于构建前端用户界面。前后端交互主要涉及 API 设计、请求发送和响应处理等方面。以下是一些关于 Spring Boot 和 Vue.js 前后端交互的关键点&#xff1a; 1. API 设…

Java | Leetcode Java题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int ans 0;while (l < r) {int area Math.min(height[l], height[r]) * (r - l);ans Math.max(ans, area);if (height[l] < height[r]…

QT4 移植 googlepinyin输入法

一.参考资料 谷歌输入法材料清单 二 编译库文件 1.Win a.编译所需要的库文件 打开工程 googlepinyin.pro&#xff0c;编译所需要的库文件&#xff0c;debug 和release都要编译一个。b.命名文件并复制到工程文件夹googlepinyin下 将debug 版本 libgooglepinyin.a 重命名为…

最好用的安卓按钮(3)

属性解释 按钮文字 app:text“床前明月光” 按钮文字颜色 app:textColor“color/color_white” 按钮文字大小 app:textSize“22sp” 按钮背景颜色 app:color_normal“color/color_accent” 0x2 单独设置每个圆角 效果 代码 <top.androidman.SuperButton android:layo…

idea 开发serlvet汽车租赁管理系统idea开发sqlserver数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 汽车租赁管理系统是一套完善的web设计系统sqlserver数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 java se…

Vue input密码输入框自定义密码眼睛icon

我们用的饿了么UI组件库里,密码输入框的icon是固定不变的,如下所示: 点击"眼睛"这个icon不变,现在需求是UI给的设计稿里,密码输入框的"眼睛"有如下两种: 代码如下: <el-input:key="passwordType"ref="password"

基于卷积神经网络的天气识别系统(pytorch框架)【python源码+UI界面+前端界面+功能源码详解】

功能演示&#xff1a; 天气识别系统&#xff0c;vgg16&#xff0c;mobilenet卷积神经网络&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的天气识别系统是在pytorch框架下实现的&#xff0c;系统中有两个模型可选…

概率论原神版

原概率论教材进行生动修改&#xff0c;插入图画&#xff0c;底部附下载链接 内容与原书保持了一致&#xff0c;增加了可读性 内容十分有趣&#xff0c;学起来也压力很小 下载链接&#xff1a; 链接: https://pan.baidu.com/s/1-KLo0Uxpp9Q9ZChfzEg5kw?pwdgmf6 提取码: gmf…

C#探索之路基础夯实篇(3):面向对象的三大特性和五大原则详解

文章目录 前提&#xff1a;一、特性&#xff1a;二、原则&#xff1a;三、示例1. 单一职责原则 (Single Responsibility Principle, SRP)&#xff1a;2. 开放-封闭原则 (Open-Closed Principle, OCP)&#xff1a;3. 里氏替换原则 (Liskov Substitution Principle, LSP)&#xf…

51单片机实验03-定时器T0来实现流水灯从左到右再从右到左

目录 一、实验目的 二、实验说明 1、51单片机有两个16位内部计数器/定时器&#xff08;C/T&#xff0c; Counter/Timer&#xff09;。 2、模式寄存器TMOD 1) M1M0工作模式控制位&#xff1b; 2) C/T定时器或计数器选择位&#xff1a; 3&#xff09;GATE定时器/计数器运行…

高可用集群-keepalived

一、高可用集群的基本理论 1.基本概念 ①&#xff1a;单点故障&#xff08;Single Point of Failure&#xff09; 硬件故障&#xff1a;设计缺陷、wear out&#xff08;损耗&#xff09;、自然灾害…… 软件故障&#xff1a;设计缺陷 bug ②&#xff1a;健康状态监测 监测手段…

使用 RisingWave、NATS JetStream 和 Superset 进行实时物联网监控

在物联网&#xff08;IoT&#xff09;背景下&#xff0c;处理实时数据会遇到一些特定的障碍&#xff0c;如边缘计算资源不足、网络条件限制、扩展性存在问题、设备间有多样性差异。要克服这些挑战&#xff0c;需要高效的边缘计算技术、强大的安全措施、标准化协议、可扩展的管理…

Pytorch数据结构:GPU加速

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

html写一个登录注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册登录界面Ⅰ</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.mi…

GA-SVM,基于GA遗传算法优化SVM支持向量机回归预测(多输入单输出)

基于遗传算法&#xff08;Genetic Algorithm, GA&#xff09;优化支持向量机&#xff08;Support Vector Machine, SVM&#xff09;用于回归预测是一个常见的任务。在这个任务中&#xff0c;我们使用GA来寻找SVM的最佳超参数配置&#xff0c;以最大化回归性能指标&#xff0c;例…

力控机器人原理及力控制实现

力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时&#xff0c;将力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Control Algorithm&#xff09;结合起来&a…

C++STL--排序算法

sort 使用快速排序,平均性能好O(nlogn),但最差情况可能很差O(n^2)。不稳定。 sort(v.begin(),v.end());//对v容器进行排序,默认升序 sort(v.begin(),v.end(),greater<int>());//降序排序对于支持随机访问的迭代器的容器&#xff0c; 都可以利用sort算法直接对其进行排序…

克罗地亚公司注册

克罗地亚是一个发达的资本主义国家&#xff0c;经济基础良好&#xff0c;旅游建筑造船和制药等产业发展水平较高&#xff0c;优质的基础设施&#xff0c;低成本的多语种和高技能劳动力&#xff0c;有力的地理环境&#xff0c;使旅游业发展充满活力&#xff0c;克罗地亚政府承诺…