关于栈的简单理解

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.hqwc.cn/news/247288.html

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

相关文章

设计模式之代理模式(1)

目录 概述定义应用场景主要角色类图 详述基本代码应用实例符合的设计原则 总结 概述 定义 代理模式是一种结构型设计模式&#xff0c;它允许通过一个代理对象来控制对原始对象的访问。代理对象可以在不改变原始对象的情况下&#xff0c;增加一些额外的功能&#xff0c;例如权限…

池化技术(对象池)

什么是池化技术 池化技术是一种很常见的编程技巧&#xff0c;目的在于提前创建如内存&#xff0c;对象&#xff0c;线程资源&#xff0c;降低程序运行时频繁的创建销毁带来的开销。常见的有线程池&#xff0c;内存池&#xff0c;对象池等。 池化技术如何提高性能&#xff0c;…

七、三台虚拟机JDK环境安装

目录 1、在三台机器上分别创建安装目录

glibc下的tpmalloc

文章目录 1、内存布局2、操作系统内存分配的相关函数2.1 Heap 操作相关函数2.2 Mmap 映射区域操作相关函数 3、ptmalloc的实现原理3.1 Main_arena 与 non_main_arena3.2 chunk 结构3.3 空闲 chunk 容器的组织形式3.3.1 small bin3.3.2 Large bins3.3.3 Unsorted bin3.3.4 Fast …

【Qt开发流程】之事件系统1:事件系统描述及事件发生流程

Qt的事件系统 在Qt中&#xff0c;事件是对象&#xff0c;派生自抽象的QEvent类&#xff0c;它表示应用程序内部发生的事情或作为应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理&#xff0c;但它们与小部件特别相关。以下描述了在典型应用程序中…

【南昌大学主办、往届均已实现EI、Scopus双检索】第三届电子信息工程与数据处理国际学术会议(EIEDP 2024)

第三届电子信息工程与数据处理国际学术会议&#xff08;EIEDP 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering and Data Processing 第三届电子信息工程与数据处理国际学术会议&#xff08;EIEDP 2024&#xff09;将于2024年3月1…

如何入驻抖音本地生活服务商,门槛太高怎么办?

随着抖音本地生活服务市场的逐渐成熟&#xff0c;越来越多平台开始涉及本地生活服务领域&#xff0c;而本地生活服务商成了一个香窝窝&#xff0c;为了保护用户权益和平台生态&#xff0c;对入驻入驻抖音本地生活服务商的条件及审核也越来越严格&#xff0c;这让很多想成为抖音…

为什么Nginx被称为反向代理

下图显示了 &#x1d41f;&#x1d428;&#x1d42b;&#x1d430;&#x1d41a;&#x1d42b;&#x1d41d; &#x1d429;&#x1d42b;&#x1d428;&#x1d431;&#x1d432; 和 &#x1d42b;&#x1d41e;&#x1d42f;&#x1d41e;&#x1d42b;&#x1d42c;&#…

JFrog----SBOM清单包含哪些:软件透明度的关键

文章目录 SBOM清单包含哪些&#xff1a;软件透明度的关键引言SBOM清单的重要性SBOM清单包含的核心内容SBOM的创建和管理结论 软件物料清单&#xff08;SBOM&#xff09;是一个在软件供应链安全中越来越重要的组成部分。它基本上是一份清单&#xff0c;详细列出了在特定软件产品…

51综合程序03-DS1302时钟

文章目录 DS1302时钟芯片一、DS1302时钟芯片的工作原理1. 芯片特点2. 引脚说明3. 寄存器地址4. 读数据的时序图5. 写数据的时序图 二、综合实例LCD1602显示 DS1302时钟芯片 一、DS1302时钟芯片的工作原理 1. 芯片特点 实时计算年、月、日、时、分、秒、星期&#xff0c;直到2…

java项目日常运维需要的文档资料

一、前言 java项目开发完成&#xff0c;部署上线&#xff0c;进入项目运维阶段&#xff0c;日常工作需要准备哪些资料和文档?当项目上线后&#xff0c;运行一段时间&#xff0c;或多或少会遇到一些运维上的问题&#xff0c;比如服务器磁盘饱满&#xff0c;服务器CPU&#xff0…

vue3 中使用 sse 最佳实践,封装工具

工具 // 接受参数 export interface SSEChatParams {url: string,// sse 连接onmessage: (event: MessageEvent) > void,// 处理消息的函数onopen: () > void,// 建立连接触发的事件finallyHandler: () > void,// 相当于 try_finally 中的 finally 部分&#xff0c;不…