【数据结构】关于栈你必须知道的内部原理!!!

news2024/9/21 11:12:58

前言:

🌟🌟Hello家人们,小编这期将带来关于栈的相关知识,以及代码的实现,希望能够帮到屏幕前的你。

📚️上期双链表博客在这里哟:http://t.csdnimg.cn/xgjK1;

📚️感兴趣的小伙伴可以关注小编哟:GGBondlctrl-CSDN博客

                                         好了那么言归正传,咱们开始吧 ~~~~🎥🎥🎥

目录

       📚️1.栈的概念

🎥1.1什么是栈??

🎥1.2什么入栈??

🎥1.3什么出栈??

      📚️ 2.栈的模拟实现

 🎥引导

🎥2.1栈的初始化

🎥2.2判断栈是否为空

🎥2.3入栈操作

 🎥2.4出栈操作

 🎥2.5输出栈顶元素

 🎥2.6长度,扩容,打印

      📚️3.栈的使用

      📚️4.总结语


       📚️1.栈的概念

🎥1.1什么是栈??

        栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。

🎥1.2什么入栈??

        栈的插入操作叫入栈(入数据在栈顶

🎥1.3什么出栈??

        栈的删除操作叫出栈(出数据在栈顶

图片如下:

总之一句话,放数据和出数据都在一个口,就像喝水一样,加水和喝水都在水面。

当然你插吸管当小编没说~~~😄😄😄

                             ok啊,了解了栈的基本原理,咱们就代码模拟一下吧~~~

                                                       冲冲冲~~~💪💪💪

      📚️ 2.栈的模拟实现

 🎥引导

        不难看出,上图所示栈是否像一个数组,0下标为栈的栈底索引,而且数据个数减去1,就是栈顶元素的下标索引,那么我们就有以下操作。

🎥2.1栈的初始化

代码如下:

public class MyStack {
    private int []elem;
    private int usedSize=0;
    public MyStack(int Range){
        this.elem=new int[Range];
    }

       在代码中我们实现数组,和设定一个代表数据个数的变量,这里在构造函数中实现数组初始化的优点是,可以在实例化对象时,自动初始话我们想要的数组以及大小。

🎥2.2判断栈是否为空

代码如下:

   public boolean isFull(){     //判断栈是否为满
        if (usedSize== elem.length){
            return true;
        }
        return false;
    }
    //判断是否为空
    public boolean isEmpty(){
        if (usedSize==0){
            return true;
        }
        return false;
    }

       在几乎所有的数组实现和链表实现中,都要进行越界处理,在此代码中当数据个数等于数组的长度时就表示栈满了,当数据个数为0时,就表示栈为空。(这里的usedSize很关键)。

🎥2.3入栈操作

代码如下:

 public int push(int e){
        if(isFull()){      //在加入数据时,判断栈是否为空
            ensureCapacity();
        }
        elem[usedSize]=e;  //加入数据
        usedSize++;        //有效数据个数加一
        return e;
    }

       这里小编多加了一个方法,表示扩容,然后加入数据,当然有效数据也得加一。

💡💡💡注意:扩容的前提是,栈满了;几乎所有的数据结构都要判断,像链表要判断节点是否存在空指针异常,数组判断索引是否越界.......

 🎥2.4出栈操作

代码如下:

public int pop(){
        if(isEmpty()){
            System.out.println("栈为空,不能出栈");
            return -1;
        }
        int ret=elem[usedSize-1];
        usedSize--;
        return ret;
    }

        和上述代码一样,首先判断栈是否为空,空了就不能出栈,否则就出栈顶元素,有效数据减去一。

 🎥2.5输出栈顶元素

代码如下:

 public int peek(){
        if(isEmpty()){
            System.out.println("栈为空,没有栈顶元素");
            return -1;
        }
        return elem[usedSize-1];
    }

       同样判断栈是否为空,然后返回栈顶元素,但是有效数据不变。

 🎥2.6长度,扩容,打印

           ~~~这几种方法小编就一笔带过咯

代码如下:

    //求长度
    public int size(){
        return usedSize;
    }

    //扩容
    private void ensureCapacity(){
        this.elem=Arrays.copyOf(this.elem,2*elem.length);
    }
    //打印
    public void display(){
        int index=0;
        while (index<usedSize){
            System.out.print(elem[index]+" ");
            index++;
        }
    }

       长度就是有效数据;扩容中要运用 Arrays.copyOf 来实现扩容,创建一个与原数组类型相同的新数组;在打印中,首先要遍历栈,然后通过索引进行打印。

      📚️3.栈的使用

                和前几期,链表,顺序表等都有类似的方法,但是栈的方法不多~~~

下面比起前面内容稍微较易,那就通过小编代码看看吧!!😁😁😁

Stack<Integer> stack=new Stack<>(); //构造一个空栈
        stack.push(1);  //入栈
        stack.push(2);
        stack.push(3);
        System.out.println(stack);
        stack.pop();     //出栈顶元素
        stack.peek();    //输出栈顶元素,但不出栈
        System.out.println(stack);
        System.out.println(stack.size());  //输出有效数据个数
        System.out.println(stack.empty()); //判断栈是否为空

这里小编注加了解释,小编就不再过多赘述了。

输出情况:

[1, 2, 3]
[1, 2]
2
false

      📚️4.总结语

       理解底层代码原理有助于我们理解并使用方法时更加得心应手,并且小编觉得数据结构学习中要多练,多写。最后小编希望与君共勉!!!🌅🌅🌅


                 💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                下期预告:【数据结构】之队列🌟🌟

                                          😊😊  期待你的关注~~~

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

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

相关文章

预测云计算的未来

云计算的未来是否依旧未知&#xff1f; 直到最近&#xff0c;云计算还是软件编程界之外很少有人熟悉的一个概念。如今&#xff0c;云计算已成为一切的基础&#xff0c;从点播电视服务和在线游戏门户网站到电子邮件和社交媒体&#xff0c;这四大现代世界的基石。云计算将继续存在…

Electron 使用Electron-build 进行打包

看完下面两篇就可以完成&#xff01; 基于vue3vite的web项目改为Electron桌面应用&#xff08;一&#xff09;_vue3转electron-CSDN博客 将web项目打包成electron桌面端教程&#xff08;二&#xff09;vue3vitets_vue3 打包桌面端-CSDN博客 打包报错 1. 首先确定依赖包 npm …

合金钢旋转花键:高强度与高耐磨性的选择

旋转花键‌是一种利用装在花键外筒内的滚珠&#xff0c;‌在精密研磨的滚动沟槽中作平滑滚动&#xff0c;‌同时传递力矩的直线运动系统。需要在振动冲击负荷作用过大、‌定位精度要求高的地方&#xff0c;‌以及需要高速运动性能的地方发挥重要作用。 旋转花键的性能跟材质有直…

龙迅#LT86102SXE适用于HDMI转两路HDMI应用方案,分辨率高达4K60HZ,提供技术支持!

1.功能 ⚫HDMI1.4和DVI 1.0规范兼容 ⚫支持3D视频格式和4Kx2K扩展分辨率格式高达3.4Gbps数据速率和4Kx2K 60Hz YCbCr 4&#xff1a;2&#xff1a;0格式 ⚫自适应均衡和失重&#xff0c;以补偿长电缆损耗 ⚫ODTs和校准 ⚫集成HDCP中继器引擎符合HDCP 1.4规范 ⚫完全硬件控制或可…

CSS文本两端对齐

背景 如果我们要写了列表或表单类的样式&#xff0c;名称长短不一&#xff0c;但是想要两端对齐&#xff0c;如下面这样的&#xff1a; 你是怎么写的&#xff1f; 是这样的吗&#xff0c;在HTML里调整加空格&#xff1a; <ul><li>用户名</li><li>账 …

探索算法系列 - 前缀和算法

目录 一维前缀和&#xff08;原题链接&#xff09; 二维前缀和&#xff08;原题链接&#xff09; 寻找数组的中心下标&#xff08;原题链接&#xff09; 除自身以外数组的乘积&#xff08;原题链接&#xff09; 和为 K 的子数组&#xff08;原题链接&#xff09; 和可被 …

电脑开机后出现bootmgr is missing原因及解决方法

最近有网友问我为什么我电脑开机后出现bootmgr is missing&#xff0c;这个提示意思是:意思是启动管理器丢失&#xff0c;说明bootmgr损坏或者丢失&#xff0c;系统无法读取到这个必要的启动信息导致无法启动。原因有很多&#xff0c;比如我们采用的是uefi引导&#xff0c;而第…

【数学建模】简单的优化模型-6 血管分支

背景&#xff1a;机体提供能量维持血液在血管中的流动&#xff0c;给血管壁以营养&#xff1b;克服血液流动的阻力&#xff0c;能量消耗与血管的几何形状有关。在长期进化中动物血管的几何形状已经在能量消耗最小原则下达到最优化。 问题&#xff1a;在能量消耗最小原则下&…

学习!胖东来秋季陈列欣赏

生鲜区 丰满、新鲜、有量感&#xff1b;色彩搭配更显艺术美&#xff01; 每个石榴专门被泡沫网套半包裹&#xff0c;避免果体受伤的同时&#xff0c;方便顾客挑选。 非季节性商品&#xff0c;以精而美的陈列形式呈现。 蔬菜区的商品分层立体陈列&#xff0c;顾客既拿既走&…

【实现100个unity特效之16】unity2022之前或者之后版本实现全屏shader graph的不同方式 —— 适用于人物受伤红屏或者一些其他状态效果

最终效果 文章目录 最终效果前言unity2022版本 Fullscreen shader graph首先&#xff0c;请注意你的Inity版本&#xff0c;是不是2022.2以上&#xff0c;并且项目是URP项且基本配置 修改shader graph边缘效果动起来优化科幻风制作一些变量最终效果最终节点图代码控制 2022之前版…

鸿蒙(API 12 Beta3版)【音频解码】

开发者可以调用本模块的Native API接口&#xff0c;完成音频解码&#xff0c;即将媒体数据解码为PCM码流。 当前支持的解码能力如下: 容器规格音频解码类型mp4AAC、MPEG(MP3)、Flac、Vorbis、AudioViVid11m4aAACflacFlacoggVorbis、opusaacAACmp3MPEG(MP3)amrAMR(amrnb、amrw…

Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]

文章目录 Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现Journyx soap_cgi.pyc接口XML外部实体注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术…

线程池原理(一)线程池核心概述

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 线程回顾 创建线程的方式 继承 Thread 类实现 Runnable 接口 创建后的线程有如下状态&#xff1a; NEW&#xff1a;新建的线程&#xff0c;无任何操作 public static void main(String[] args) {Thread…

嵌入式初学-C语言-十八

#接嵌入式初学-C语言-十七# 变量的生命周期 1. 概念&#xff1a;变量在程序运行中存在的时间 2. 根据变量存在的时间不同&#xff0c;变量可分为静态存储和动态存储 3. 变量的存储类型 变量的完整定义格式&#xff1a;[存储类型] 数据类型 变量列表; 4. 存储类型 auto&…

yolov8人脸识别案例

GitHub - wangWEI201901/YOLOv8-Detection-Project: &#x1f6e3;️基于YOLOv8的智慧校园人脸识别和公路汽车检测

ITSM垂类下,企业如何逐步搭建一个好的AI Agent

随着企业数字化转型的不断深入&#xff0c;智能服务管理&#xff08;ITSM&#xff09;逐渐成为提升企业运营效率和服务质量的关键。企业纷纷探索如何将AI技术融入到IT服务管理中&#xff0c;以提升效率、降低成本并增强用户体验。成功实施AI并非易事&#xff0c;它要求企业在战…

探索全光网技术 | 全光网络技术方案选型建议五 (大厅场景)

目录 一、场景设计需求二、大厅场景拓扑三、部署方式四、产品相关规格说明五、方案优势与特点 注&#xff1a;本文章参考资料为&#xff1a;华三官方资料 - “新华三全光网络3.0解决方案&#xff08;教育&#xff09;”与 锐捷官方资料 - “【锐捷】高校极简以太全光3.X方案设计…

web基础与http协议与配置

目录 一、web基础 1.1 DNS与域名&#xff08;详解看前面章节&#xff09; 1.2 网页的概念&#xff08;HTTP/HTTPS&#xff09; 1.2.1 基本概念 1.2.2 HTML文档结构(了解) 1.2.3 web相关重点 1.2.4 静态资源和动态资源 二、http协议 2.1 概述 2.2 cookie和session&…

【HarmonyOS NEXT星河版开发学习】小型测试案例10-计数器案例

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 鸿蒙开发中的点击事件是一个基础且重要的功能&#xff0c;它使得应用能够响应用户的各种触摸操作。通过对点击事件及其相关参数的深入…

扎克伯格说AI会让推荐系统变得更强大?一文读懂什么是智能推荐系统

导语&#xff1a;我认为很少有人意识到&#xff0c;推荐系统是世界上构想过的最大的计算系统之一。——Jensen Huang 前言 扎克伯格在 2024 年 7 月说&#xff0c;我们在组建 Reality Labs 之前就成立了 FAIR——人工智能研究中心&#xff0c;主要产品线有 Facebook 和 Insta…