数据结构 模拟实现Stack栈(数组模拟)

news2024/9/22 21:20:39

目录

一、栈的概念

二、栈的接口

三、栈的方法实现

(1)push方法

(2)pop方法

(3)peek方法

(4)size方法

​编辑

(5)empty方法

四、最终代码


一、栈的概念

概念:栈是一种先进后出的数据结构,类似羽毛球桶,先放进去的羽毛球,后面才能拿出来        如图:

还有弹匣,先放进去的子弹后面发射出去,如图:

我们定义一个自己的栈类,里面有数组,存放数据,还有一个变脸usedSize,记录栈里的元素个数,带有构造方法,不带参数的给数组默认初始化10个元素,带参数就初始化你想要的元素个数,代码如下:

public class MyStack implements IStack{

    private int[] elem;
    private int usedSize;
    private int DEFAULT_CAPACITY = 10;

    public MyStack() {
        this.elem = new int[DEFAULT_CAPACITY];
    }
    public MyStack(int n) {
        this.elem = new int[n];
    }
}

二、栈的接口

代码如下:

public interface IStack {
    public void push(int x);
    public int  pop();
    public int peek();
    public int size();
    public boolean empty();
}

三、栈的方法实现

(1)push方法

此方法是放元素进栈里面,也就是入栈,因为我们有记录栈元素个数的usedSize变量,所以我们可以用这个变量充当入栈时,要放进elem数组的哪个下标,因为usedSize记录的栈的个数,在数组中对应的下标就是个数-1;

入栈前,要检查栈是否满了,满了就要扩容,没满就给elem数组的usedSize-1下标位置放入元素,放完后usedSize++。代码如下:

    public void push(int x) {
        if(full()) {
            //扩容
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
        elem[usedSize++] = x;
    }
    private boolean full() {
        return usedSize == elem.length;
    }

执行效果如下:

elem数组里面有3个数,正好是我们入栈的元素。

(2)pop方法

此方法是出栈方法,取出栈顶元素,取完后就删除栈顶元素;在取出栈顶元素前,要检查栈是否为空,如果是空就要抛异常,因为没有元素可以出栈了;如果栈不为空,就出栈顶元素,也就是取出elem数组下标为usedSize-1的位置,然后usedSize--,代码如下:

    public int pop() {
        if(usedSize == 0) {
            throw new EmptyException("栈空了");
        }
        int tmp = elem[usedSize - 1];
        usedSize--;
        return tmp;
    }
//异常类
public class EmptyException extends RuntimeException{
    public EmptyException(String msg) {
        super(msg);
    }
}

执行效果如下:

里面有元素的时候就正常出栈,空了就会抛异常。

(3)peek方法

peek翻译成中文就是瞄一眼的意思,此方法也是就拿到栈顶元素,但不会删掉栈顶的元素,里面的操作和pop一样,但不会usedSize--,代码如下:

    public int peek() {
        if(usedSize == 0) {
            throw new EmptyException("栈空了");
        }
        int tmp = elem[usedSize - 1];
        return tmp;
    }

执行效果如下:

一直打印的都是栈顶元素,说明没有出栈顶元素,只是拿栈顶元素。

(4)size方法

此方法是获取栈里的元素,所以这里直接返回usedSize就好了,代码如下:

    public int size() {
        return usedSize;
    }

执行效果如下:

(5)empty方法

此方法是判断栈是不是空的,所以直接判断usedSize==0就好了,返回这个表达式的结果,代码如下:

    public boolean empty() {
        return usedSize == 0;
    }

执行效果如下:


四、最终代码

//接口类
public interface IStack {
    public void push(int x);
    public int  pop();
    public int peek();
    public int size();
    public boolean empty();
}

//自定义MyStack类
public class MyStack implements IStack{

    private int[] elem;
    private int usedSize;
    private int DEFAULT_CAPACITY = 10;

    public MyStack() {
        this.elem = new int[DEFAULT_CAPACITY];
    }
    public MyStack(int n) {
        this.elem = new int[n];
    }

    @Override
    public void push(int x) {
        if(full()) {
            //扩容
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
        elem[usedSize++] = x;
    }
    private boolean full() {
        return usedSize == elem.length;
    }

    @Override
    public int pop() {
        if(usedSize == 0) {
            throw new EmptyException("栈空了");
        }
        int tmp = elem[usedSize - 1];
        usedSize--;
        return tmp;
    }

    @Override
    public int peek() {
        if(usedSize == 0) {
            throw new EmptyException("栈空了");
        }
        int tmp = elem[usedSize - 1];
        return tmp;
    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public boolean empty() {
        return usedSize == 0;
    }
}

//自定义异常类
public class EmptyException extends RuntimeException{
    public EmptyException(String msg) {
        super(msg);
    }
}

都看到这了,点个赞再走吧,谢谢谢谢谢!

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

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

相关文章

自动重置密码

在运维工作中为用户重置密码是常见的操作,虽然手工运行 passwd 命令就可以很方便地设置,但在用户忘记密码后还需要管理员操作。在用户数量很大时也是不小的工作量。因此为用户提供工具来自动重置密码就很有必要。 技术方案 技术方案比较简单&#xff0…

和鲸社区数据分析每周挑战【第一百二十一期:电商店铺经营分析】

和鲸社区数据分析每周挑战【第一百二十一期:电商店铺经营分析】 文章目录 和鲸社区数据分析每周挑战【第一百二十一期:电商店铺经营分析】一、数据文档二、探索性数据分析三、品类销售效果评估四、用户参与活动优惠的购物行为分析五、不同订单来源对购买…

Qt实现文本编辑器(二)

上一章节讲述了如何制作文本编辑页面,以及应该有哪些功能需要实现,只是做了展示效果,实际的点击事件并没有处理。今天来具体讲解下是如何实现菜单栏以及工具栏上对应的需求吧~ 功能实现 功能: 1、动作消息触发 2、具体功能&am…

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释 默认情况下,注释都是从改行的顶格开始,看起来不太美观而且不易清除分级 设置让其从代码处开始,步骤:File–>Sttings–>Editor–>Code Style &#xff…

使用 CompletableFuture 分批处理任务

一、无返回值任务函数 // 数据分批 List<List<StatisticsDTO>> batches Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures new ArrayList<>(batches.size());// 数据处理 for (int i 0; i < batches…

C++:类和对象(3)

目录 1.构造函数调用规则 2.深拷贝和浅拷贝 3.初始化列表 4.类对象作为类成员 1.构造函数调用规则 默认情况下&#xff0c;C编译器至少给类添加三个函数&#xff1a; 1.默认构造函数(无参&#xff0c;函数体为空) 2.默认析构函数(无参&#xff0c;函数体为空) 3.默认拷贝构…

GNSS位移监测站对尾矿库坝体表面位移进行自动化监测

表面位移监测&#xff1a;通过GNSS位移监测站对尾矿库坝体表面位移进行自动化监测&#xff0c;掌握尾矿坝整体表面位置的变化及其变化速率&#xff08;包括平面位移和垂直沉降&#xff09;&#xff0c;确定尾矿坝坝体整体位移变形的情况&#xff0c;是确定尾矿库安全性的重要指…

一文讲透SPSS相关性分析结果怎么看?

推荐采用《SPSS统计分析入门与应用精解&#xff08;视频教学版&#xff09;》 杨维忠、张甜 清华大学出版社“5.1 双变量相关分析” 的解答。 本节内容选自《SPSS统计分析入门与应用精解&#xff08;视频教学版&#xff09;》 杨维忠、张甜 清华大学出版社“5.1 双变量相关分析…

Protobuf 编码结构

编码结构 什么是protobuf protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法&#xff0c;可用于数据通信协议和数据存储等&#xff0c;它是 Google 提供的一个具有高效协议数据交换格式工具库&#xff0c;是一种灵活、高效和自动化机制的结构数据序列…

24款奔驰C260L升级C63包围 渣男的外表

今天店里来了一台24款奔驰C260L 一提车就过来升级 我们公司还有包上牌服务 车主说 升级完包围 帮忙安排一下 原车的包围 没有那么霸气 特别是后杠 光溜溜的 升级后 四出尾喉 尾翼 直接牌面就起来了&#xff0c;星骏汇小许Xjh15863

真核微生物基因序列鉴定工具EukRep工具的安装和详细使用方法

介绍 EukRep是一种用于鉴定并分析环境中的真核微生物的工具。它基于16S rRNA基因序列&#xff0c;可以帮助研究人员确定和分类环境样品中存在的真核微生物群落。 EukRep 从宏基因组数据集中分类真核和原核序列 安装 要求Python3 推荐使用conda安装&#xff1a; $ conda cre…

HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1YVcnOP5YKfFOoLt0z706rg?pwdfwp0 提取码&#xff1a;fwp0 MagicBook荣耀原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为/荣耀电脑管家等预装程序 文件格式&#xff1a;esd/wim/swm 安装…

【项目实战】分布式计算和通信框架(AKKA)入门介绍

一、AKKA是什么&#xff1f; Akka是一个用于构建高并发、分布式、可容错、事件驱动的应用程序的工具包和运行时。它基于Actor模型&#xff0c;提供了一种高效的并发编程模型&#xff0c;可以轻松地编写出高并发、分布式、可容错的应用程序。Akka还提供了一些常用的组件&#xf…

DMX512输出协议详解

目录 ​编辑 1、DMX512协议简介 2、DMX512协议分析 DMX512指令帧介绍 DMX512信息包 3、DMX512接口电路 4、参考代码 1、DMX512协议简介 DMX512是一种用于舞台灯光控制的数字传输协议。它是由美国舞台灯光协会&#xff08;USITT&#xff09;于1990年发布的工业标准&…

利用小红书笔记详情API:为内容运营提供强大的支持

利用小红书笔记详情API&#xff0c;内容运营者可以获得对小红书平台上的笔记内容的深入洞察&#xff0c;从而为其运营工作提供强大的支持。以下是该API如何支持内容运营的几个关键方面&#xff1a; 获取笔记内容与数据&#xff1a; API允许内容运营者直接获取小红书平台上的笔记…

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

57.6K star!一个免费开源的 API 开发生态系统

&#xff01;&#xff01;&#xff01;文末有链接&#xff01;&#xff01;&#xff01; 小伙伴们&#xff0c;你们有没有遇到这样的问题呢&#xff1f;当你作为前端开发者和后端开发者一起协同工作时&#xff0c;联调接口成了必须要做的工作。 而为了验证接口的稳定性和安全…

Python武器库开发-武器库篇之子域名扫描器开发(四十一)

Python武器库开发-武器库篇之子域名扫描器开发(四十一) 在我们做红队攻防或者渗透测试的过程中&#xff0c;信息收集往往都是第一步的&#xff0c;有人说&#xff1a;渗透的本质就是信息收集&#xff0c;前期好的信息收集很大程度上决定了渗透的质量和攻击面&#xff0c;本文将…

LabVIEW在高级结构监测中的创新应用

LabVIEW在高级结构监测中的创新应用 LabVIEW作为一个强大的系统设计平台&#xff0c;其在基于BOTDA&#xff08;光时域反射分析&#xff09;技术的结构监测中发挥着核心作用。利用LabVIEW的高效数据处理能力和友好的用户界面&#xff0c;开发了一个先进的监测系统。该系统专门…

ThreadPoolExecutor中的keepAliveTime详解

一.keepAliveTime的概念&#xff1a; keepAliveTime的单位是纳秒&#xff0c;即1s1000000000ns&#xff0c;1秒等于10亿纳秒。 keepAliveTime是线程池中空闲线程等待工作的超时时间。 当线程池中线程数量大于corePoolSize&#xff08;核心线程数量&#xff09;或设置了allowCor…