关于栈的简单理解

1. 栈(Stack)

1.1 文字讲解

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

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

        出栈:栈的删除操作叫做出栈。出数据在栈顶。

1.2 图像分析

        从上图中可以看到,Stack继承了Vector父类,Vector和ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。 

        下图图一和图二分别是入栈和出栈操作关于栈顶和栈底的图解:

2、自定义栈的实现 

2.1  栈的实现方法和功能表达

        详细方法和功能如下图:

2.2 自定义栈的代码实现

        说明:本栈的实现主要 采用int型数组的结构;

2.2.1 栈的创建

        思路:

        1、创建一个MyStack类,其中定义两个成员变量,数组(用来存放底层数据)和长度(用来记录当前的栈里面存放数据的数量),实现3中定义的接口,重写其方法让栈的操作具体化;

        2、构造方法,创建一个默认长度为10的数组;

public class MyStack implements IStack{private int[] data;private int usedLength;//实际已经占用的数组长度private static final int Default_Length = 10;public MyStack() {this.data = new int[Default_Length];}@Overridepublic void push(int x) {}@Overridepublic int pop() {return 0;}@Overridepublic int peek() {return 0;}@Overridepublic int size() {return 0;}@Overridepublic boolean empty() {return false;}@Overridepublic boolean full() {return false;}
}

        3、定义一个接口,在里面创建栈一系列操作的抽象方法;

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

2.2.2 压栈方法的实现

        1、首先对当前栈进行判断是否为满,若满则需要对当前栈进行二倍容量扩容

        2、当栈的容量充足时,在栈顶进行入栈(底层数组尾部进行添加数据)

        3、当前栈的数量长度加一;

@Overridepublic void push(int x) {if (full() == true){this.data = Arrays.copyOf(data,2*Default_Length);}data[usedLength] = x;usedLength++;}@Overridepublic boolean full() {if (usedLength == data.length){return true;}return false;}

 2.2.3 栈是否为空操作

 @Overridepublic boolean empty() {return usedLength == 0;}

2.2.4出栈的实现

       思路:

         1、首先得判断当前栈栈是否为空,若为空我们需要抛出栈为空自定义异常(自定义一个异常为EmptyException);

public class EmptyException extends RuntimeException{public EmptyException(String msg) {super(msg);}
}

        2、将当前的栈顶的元素存储到容器中并返回

        3、将栈的长度加一,之前栈顶的数据引用地址就会变成null(空指针),出栈的数据的地址就不会被引用而导致数据从栈里消失;

        图解如下:

        代码如下:

 @Overridepublic int pop() {if (empty()){throw new EmptyException("当前这个栈是空的!!!");}int old = data[usedLength-1];usedLength--;//相当于是删除return old;}

2.2.5获取栈中数据元素个数

@Overridepublic int size() {return usedLength;}

2.2.6获取栈顶元素

        思路类似于2.2.4;

 @Overridepublic int pop() {if (empty()){throw new EmptyException("当前这个栈是空的!!!");}int old = data[usedLength-1];usedLength--;//相当于是删除return old;}

3.关于链表的栈使用
3.1单链表

        从头部插入(入栈),从头部删除(出栈),时间复杂度为O(1);

         从尾部插入(入栈),从尾部删除(出栈),时间复杂度为O(n);不建议使用

3.2双向链表:

        从头部插入(入栈),从头部删除(出栈)

        从尾部插入(入栈),从尾部删除(出栈),有last引用,直接到表尾部        

        二者时间复杂度皆为O(1);

3.3 LinkedList自带实现方法:

 public static void main(String[] args) {LinkedList<Integer> linkedList = new LinkedList<>();linkedList.push(101);linkedList.push(102);linkedList.push(103);linkedList.push(104);System.out.println(linkedList.peek());System.out.println(linkedList.pop());System.out.println(linkedList.pop());}

        测试结果:

 

4.Q&A

Q1:栈、虚拟机栈、栈帧有什么区别呢?

A1:

        栈:是一种数据结构里面的概念,用来存放数据的一种模式;

        虚拟机栈:jvm虚拟机划分的一块内存;

        栈帧:调用方法的时候会在虚拟机中给这个方法开辟一个空间;

ps:本次内容就到这里了,如果喜欢的话就请一键三连哦!!!


 

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

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

相关文章

gromacs学习及使用(1)

1.Gromacs的使用 2.Gromacs 的第一步_能量最小化 3.分子动力学模拟Gromacs一般使用步骤&#xff08;空蛋白&#xff09; 4.GROMACS优化(没看懂) 5.GROMACS快速入门&#xff08;有好东西&#xff09; GROMACS中文教程 gmx editconf -f xxx -o xxx6.GROMACS运行参数之em.mdp文…

Open3D 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理

docker踩坑记录:docker容器创建doris容器间无法通讯问题

背景&#xff1a; 开发大数据平台&#xff0c;使用doris作为数据仓储&#xff0c;使用docker做集群部署&#xff0c;先进行开发环境搭建&#xff0c;环境为BE1;FE1&#xff0c;原来使用官方例子&#xff0c;但是官方例子是创建了一个bridge使用172.20.80.0/24通讯&#xff0c;…

「Swift」类淘宝商品瀑布流展示

前言&#xff1a;需要做一个类似于淘宝商品页面的瀑布流展示 结构分析&#xff1a; ps&#xff1a;图片来源 思路分析&#xff1a; 该瀑布流主要还是基于UICollectionView进行展示&#xff0c;只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义&#xff…

Mybatis 操作续集(连着上文一起看)

"查"操作(企业开发中尽量不使用*,需要哪些字段就写哪些字段,都需要就全写上) Mybatis 会自动地根据数据库的字段名和Java对象的属性名进行映射,如果名称一样就进行赋值 但是那些名称不一样的,我们想要拿到,该怎么拿呢? 一开始数据库字段名和Java对象属性名如下图…

C# | 使用AutoResetEvent和ManualResetEvent进行线程同步和通信

使用AutoResetEvent和ManualResetEvent进行线程同步和通信 文章目录 使用AutoResetEvent和ManualResetEvent进行线程同步和通信介绍AutoResetEventManualResetEvent 异同点使用场景和代码示例AutoResetEvent 使用示例ManualResetEvent 使用示例阻塞多个线程并同时激活 介绍 在…

创新领航 | 竹云参编《基层智治系统安全接入规范》团体标准正式发布!

近日&#xff0c;由杭州市委办公厅&#xff08;市密码管理局&#xff09;、杭州市基层治理综合指挥保障中心、杭州市拱墅区社会治理中心、杭州市拱墅区数据资源管理局、杭州竹云数字智能科技有限公司、杭州智诚质量标准技术评定中心共同参与编写的《基层智治系统安全接入规范》…

Video Studio会声会影2024中文直装旗舰版

Corel Video Studio会声会影2024中文直装旗舰版是一款很流行的视频编辑处理软件&#xff0c;由于其简单易用&#xff0c;且功能不错&#xff0c;在国内拥有众多使用者&#xff0c;小编之前给大家分享过Corel Video Studio Ultimate会声会影2024旗舰版中文版&#xff0c;今天再为…

8.7 矢量图层点要素点分布(Point displacement)使用

文章目录 前言点分布&#xff08;Point displacement&#xff09;QGis代码实现 总结 前言 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号、矢量-点要素-分级符号以及矢量-点要素-基于规则的使用本章介绍如何使用点分布&#xff08;Point displacement&#xff09;说明…

【兔子王赠书第10期】零基础入门Python,看这篇就够啦!

文章目录 写在前面推荐图书前言为什么要学习编程如何学习编程本书内容获得帮助 推荐理由粉丝福利写在后面 写在前面 粉丝福利第10期来啦&#xff0c;本期博主给大家推荐一本非常适合零基础入门Python的图书&#xff1a;《Python超能学习手册》&#xff0c;祝大家读完本书后都可…

C++:智能指针[重点!]

目录 一、关于智能指针 1、引入智能指针 2、RAII 二、详述智能指针 auto_ptr unique_ptr shared_tr 循环引用 weak_ptr 定制删除器 三、关于内存泄漏 一、关于智能指针 1、引入智能指针 首先引入一个例子&#xff1a; 在Test函数中&#xff0c;new了两个对象p1p2&a…

vue中的this.$nextTick().then()

MENU 示例一示例二sortsplicepushrandomfloorMathwhile演示 示例一 let reorganize function (arr){let rest [];while (arr.length > 0) {let random Math.floor(Math.random() * arr.length);// 把获取到的值放到新定义的数组中rest.push(arr[random]);// 这句代码的作…

【Flink】Flink核心概念简述

目录 一、Flink 简介二、Flink 组件栈1. API & Libraries 层2. runtime层3. 物理部署层 三、Flink 集群架构四、Flink基本编程模型五、Flink 的优点 一、Flink 简介 Apache Flink 的前身是柏林理工大学一个研究性项目&#xff0c; 在 2014 被 Apache 孵化器所接受&#xf…

Hive jar包冲突问题排查解决

1、报错情况 hiveserver2启动失败&#xff0c;查看日志报错&#xff1a; 2022-07-04T20:14:53,315 WARN [main]: server.HiveServer2 (HiveServer2.java:startHiveServer2(1100)) - Error starting HiveServer2 on attempt 1, will retry in 60000ms java.lang.NoSuchMethod…

『Charles数据抓包功攻略』| 如何使用Charles进行数据抓包与分析?

『Charles数据抓包功攻略』| 如何使用Charles进行数据抓包与分析&#xff1f; 1 Charles简介2 Charles主要功能3 Charles下载4 Charles安装5 Charles界面介绍6 不能抓取localhost数据的解决方法7 http抓包8 https抓包8.1 SSL证书导入8.2 SSL Proxying Setting设置 9 APP抓包9.1…

Redis高可用之Sentinel哨兵模式

一、背景与简介 Redis关于高可用与分布式有三个与之相关的运维部署模式。分别是主从复制master-slave模式、哨兵Sentinel模式以及集群Cluster模式。 这三者都有各自的优缺点以及所应对的场景、对应的业务使用量与公司体量。 1、主从master-slave模式 【介绍】 这种模式可以采用…

ssm土家风景文化管理平台源码和论文答辩PPT

摘要 土家风景文化管理平台是土家风景文化管理必不可少的一个部分。在风景文化管理的整个过程中&#xff0c;平台担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类土家风景文化管理平台也在不断改进。本课题所设计的土家风景文化管理平台&#xff0c;使用jav…

FacetWP Relevanssi Integration相关性集成插件

点击阅读FacetWP Relevanssi Integration相关性集成插件原文 FacetWP Relevanssi Integration相关性集成插件是FacetWP与用于高级搜索的 Relevanssi 插件的集成显着增强了您网站的搜索功能。这个强大的工具使您的用户能够轻松找到他们寻求的特定内容&#xff0c;无论他们的查询…

MySQL:找回root密码

一、情景描述 我们在日常学习中&#xff0c;经常会忘记自己的虚拟机中MySQL的root密码。 这个时候&#xff0c;我们要想办法重置root密码&#xff0c;从而&#xff0c;解决root登陆问题。 二、解决办法 1、修改my.cnf配置文件并重启MySQL 通过修改配置文件&#xff0c;来跳…

Course2-Week2-神经网络的训练方法

Course2-Week2-神经网络的训练方法 文章目录 Course2-Week2-神经网络的训练方法1. 神经网络的编译和训练1.1 TensorFlow实现1.2 损失函数和代价函数的数学公式 2. 其他的激活函数2.1 Sigmoid激活函数的替代方案2.2 如何选择激活函数2.3 为什么需要激活函数 3. 多分类问题和Soft…