数据结构——栈和队列

news2024/12/24 3:24:36

目录

一、栈(Stack)

1、定义

2、顺序结构模拟实现栈和常用方法

(1).栈的顺序存储

(2).基本方法

3、栈的链式结构与顺序结构对比

(1).对比

4、区分概念

(1).栈

(2).虚拟机栈

(3).栈帧

二、队列(Queue)

1、定义

2、链式结构模拟实现队列及常用方法

(1).队列的链式结构初始化

(2).常用方法

[1].入队

[2].出队

[3].获取队头元素

[4].获取有效元素个数

[5]. 检测是否为空

3、循环队列

(1).循环队列的数组下标

(2).区分空的循环队列和满的循环队列

4、链式结构队列和循环队列的比较

5、双端队列(Deque)

(1).定义

(2).Deque是一个接口,使用时必须创建LinkedList对象

(3).Deque接口使用较多,栈和队列均可使用该接口


一、栈(Stack)

1、定义

栈是一种特殊的线性组,只允许在一端进行插入和删除元素(这一端称为 栈顶,另一端称为 栈底)。数据元素遵循 先进后出的原则。

入栈(压栈):栈的元素插入操作

出栈:栈的元素删除操作

2、顺序结构模拟实现栈和常用方法

(1).栈的顺序存储

该栈的底层逻辑是一组地址连续的存储单元,用来从栈底开始存放元素

(2).基本方法

[1]. 构造一个空的栈。

public class MyStack {
    public int[] elem;
    public int usedSize;

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

[2].入栈

public void push(int val){
    if(isFull()){
        elem= Arrays.copyOf(elem,2*elem.length);
    }
    elem[usedSize++]=val;
}
public boolean isFull(){
    return usedSize==elem.length;
}

[3].出栈

public int pop(){
    if(isEmpty()){
        throw new EmptyException("栈为空!!!");
    }
    int val=elem[usedSize-1];
    usedSize--;
    return val;
}

[4].判空

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

[5].读取栈顶元素(不出栈)

public int peek(){
    if(isEmpty()){
        throw new EmptyException("栈为空!!!");
    }
    return elem[usedSize-1];
}

[6].获取个数

int size() 获取栈中有效元素个数

public int size(){
    return usedSize;
}

3、栈的链式结构与顺序结构对比

(1).对比

相比于顺序结构的栈,链栈可以进行多个栈共享存储空间以提高内存利用率并且几乎不会存在栈满的情况。此外在时间复杂度上顺序栈和链栈相同均为O(1)。

在空间上顺序栈需要事先确定一个固定的长度,因此存取时很方便,但是可能会存在空间浪费。链式栈在空间上通过指针域连接下一个元素,虽然增加了一点内存的消耗但是栈的长度可以是无限的且不会存在空间浪费。

所以如果栈在使用过程中元素个数变化大,最好是用链栈。反之,如果元素个数的变化在一定范围内,建议使用顺序栈。

4、区分概念

(1).栈

是一种数据元素先进后出的数据结构

(2).虚拟机栈

具有特殊作用的一块内存空间。jvm为了对数据进行更好的管理,将内存按照不同的需求划分出来的结构。

栈区:线程私有的,栈区中存放的是函数调用相关的一些信息,主要是栈帧。

当栈区中内存空间不足时,会抛出StackOverflowException;当中的元素(栈帧)是按照数据结构中的栈的特性来实现的

(3).栈帧

一种结构,这种结构与函数调用相关的,内部:局部变量表、操作数栈。

每个方法在运行时,jvm都会创建一个栈帧,然后将栈帧压入到虚拟机栈中。当方法调用结束时,该方法对应的栈帧会从虚拟机栈中出栈。

注意:每个方法的栈帧中结构都是一样,大小可能不同,但是栈帧的大小在程序编译时就已经确定好。

二、队列(Queue)

1、定义

只允许在一端进行数据插入(这一端称为 队尾Head/Front),在另一端进行数据删除(这一端称为 队尾Tail/Rear)的特殊线性表。数据元素 先进先出

入队:队列的数据元素插入操作

出队:队列的数据元素删除操作

2、链式结构模拟实现队列及常用方法

(1).队列的链式结构初始化

public class MyQueue {
    static class Node{
        public int val;
        public Node next;
        public Node(int val){
            this.val=val;
        }
    }
    public Node head;
    public Node last;
    public int usedSize;
}

注意:Queue是个接口,底层是通过链表实现的

(2).常用方法

[1].入队

public void offer(int val){
    Node node=new Node(val);
    if(head==null){
        head=node;
        last=node;
    }else{
        last.next=node;
        last=node;
    }
    usedSize++;
}

[2].出队

public int poll(){
    if(empty()){
        throw new EmptyException("队列为空!!!");
    }
    int ret=head.val;
    head=head.next;
    if(head==null){
        last=null;
    }
    usedSize--;
    return ret;
}

[3].获取队头元素

public int peek(){
    if(empty()){
        throw new EmptyException("队列为空!!!");
    }
    return head.val;
}

[4].获取有效元素个数

public int getUsedSize() {
    return usedSize;
}

[5]. 检测是否为空

public boolean empty(){
    return first == null;
}

3、循环队列

循环队列通常使用数组实现,我们把队列的这种头尾相接的顺序存储结构称为循环队列。

当队头指针front = array.length-1后,再前进x个位置就自动到下一个循环,这可以利用除法取余实现。

初始时:front =rear=0。

判空:front=rear

判满:(rear+1)%array.length=front

队首指针退x:front = (front + array.length - x) % array.length

队尾指针进x:rear = (rear + x) % array.length

队列长度:len=(rear - front + array.length) % array.length

(1).循环队列的数组下标

[1].下标在最后一个时再往后

index=(index+x)%arr.length

[2].下标在第一个时再往后

(index+arr.length-x)%arr.length

(2).区分空的循环队列和满的循环队列

[1].添加usedSize属性

我们可以创建一个成员变量 usedSize,只有当 usedSize==队列长度时判满,当 usedSize==0 为空队列

[2].使用标记

类型中增设flag数据成员,以区分是队满还是队空。

flag 等于0时,如果删除后 front = = rear ,则为队空;

flag 等于 1 时,如果插入后 front == rear ,则为队满。

[3].保留一个位置

为了区分队空和队满,我们保留最后一个位置。

如下图,当rear=front便认为是队空,当rear+1=front时认为是队满。

4、链式结构队列和循环队列的比较

在空间上:链式队列的数据存储是通过指针域连接的,会产生一些空间上的开销;而循环队列有一个固定的长度,所以在存储空间上存在浪费,因此链队更加的灵活。

在时间上:两者数据操作的时间复杂度都是O(1)。链式队列因为是通过指针域连接的,所以每次添加和删除结点都会存在一些时间消耗,而循环队列是先申请一个固定空间,使用时不释放,如果入队频繁,则两者还是有细微差异。

因此在确定队列最大值时,使用循环队列;无法确定队列的长度时,则用链式队列。

5、双端队列(Deque)

(1).定义

双端队列(deque)是允许两端都可以入队和出队操作的队列(队头可以出队入队,队尾也可以出队入队)。deque 是 “double ended queue” 的简称。

(2).Deque是一个接口,使用时必须创建LinkedList对象

(3).Deque接口使用较多,栈和队列均可使用该接口

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现

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

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

相关文章

JavaScript 库之 vanilla-tilt(一个平滑的 3D 倾斜库)

JavaScript 库之 vanilla-tilt&#xff08;一个平滑的 3D 倾斜库&#xff09;参考获取vanilla-tilt特点使用示例使用1. data-tilt2. VanillaTilt.init()优先级示例配置选项其他参考 项目描述GitHub前往Vanilla-tilt.js前往 获取 Vanilla-tilt.jsGitHubnpm npm install vanil…

【开发环境】JRE 裁剪 ② ( 裁剪 bin 目录下的 dll 动态库文件 | 压缩 rt.jar 文件 )

文章目录一、裁剪 lib 目录下的 jar 文件二、压缩 rt.jar 文件参考博客 : 精简jre1.8精简jre步骤裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 ( 本篇博客的资源快照 , 不是最终版的裁剪效果 ) : https://download.csdn.net/download/han1202012/87389091 JRE 裁剪分为三…

Pytorch深度学习【十五】

微调 网络架构 一个神经网络一般可以分成两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调 思路—将相同功能的网络及其参数直接进行迁移使用&#xff0c;而并不是通过重新学习&#xff0c;只改变部分层次即可 训练 是一个目标数据集上的正常训练任务…

老杨说运维 | 2023,浅谈智能运维趋势(二)

&#xff08;文末附视频&#xff0c;一键观看精彩内容&#xff09; 前言&#xff1a; 上文提到了智能运维现状中的变化趋势以及 上文提到了智能运维现状中的变化趋势以及过往误区&#xff0c;老杨认为智能运维的体系化建设还需从抓牢数据治理为起点&#xff0c;以终为始做好规…

miniconda虚拟环境安装使用jupyter notebook及相关

一、安装jupyter 1创建miniconda虚拟环境。&#xff08;前面文章讲过了&#xff09; 2在创建的虚拟环境下&#xff0c;conda install ipython jupyter 3在该环境下执行jupyter notebook。 注意&#xff1a;此时打开的jupyter notebook内核Python 3(ipykernel)对应该虚拟环境&am…

数据安全治理 1

数据安全治理应以数据为中心&#xff0c;多元化主体共同参与&#xff0c;兼顾发展与安全。 数据安全总体视图&#xff0c;包含了体系&#xff0c;维度&#xff0c;目标&#xff0c;实践。 制度建设 技术体系&#xff0c;如加密、脱敏等手段&#xff0c;进行数据全生命周期的管…

盘点:2022年豆瓣评分8.0以上的计算机书籍有哪些?

2022年已经结束 &#xff0c;小编来盘点一下过去一年里出版的计算机图书里&#xff0c;有哪些计算机书籍是豆瓣评分8.0以上图书。 1、人工智能&#xff1a;现代方法&#xff08;第4版&#xff09;&#xff08;上下册&#xff09; ​ 系统性总结人工智能的方方面面&#xff0c;…

寒假每日一题2023——4261. 孤独的照片

写在前面 题目来源&#xff1a;AcWing 寒假每日一题2023活动 链接&#xff1a;https://www.acwing.com/problem/content/description/4264/ 题目 Farmer John 最近购入了 N 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#x…

论文解读12——NGBoost: Natural Gradient Boosting for Probabilistic Prediction

目录1、文章贡献2、评分规则3、自然梯度4、自然梯度提升算法NGBoost1、文章贡献 由吴恩达团队提出的NGBoost是一种通过梯度提升进行概率预测的算法&#xff0c;与经典的回归模型返回一个点估计结果不同&#xff0c;概率回归模型返回全概率分布&#xff0c;将条件分布的参数视为…

Windows系统安装jenkins服务 war包形式

1.首先下载 jenkins war包 注意和jdk 的版本匹配 https://www.jenkins.io/zh/download/ 2.配置jenkins环境变量 如果不配置环境变量, jenkins的主目录默认生成在c盘下 环境变量怎么配? 请自行百度 3.运行jar包 注意修改war包路径 java -jar /data/jenkins/jenkins.war…

DNS原理与搭建(一)

文章目录一、DNS的概念与原理二、DNS私服搭建一、DNS的概念与原理 概念 DNS指的是域名服务器&#xff0c;就是将域名转换成IP[或者将IP转换成域名];当我们在浏览器中输入域名并按下回车&#xff0c;会对我们输入的域名进行解析&#xff0c;并返回一个IP地址&#xff0c;在通过…

Deepin系统深度学习环境配置指南

Deepin深度操作系统在众多Linux发行版本中深受欢迎&#xff0c;在实用性和专业方面到达了很好的均衡&#xff0c;该系统软件适配丰富支持很多第三方软件&#xff0c;增加了系统任务的灵活性。在装好该系统后&#xff0c;如何在该系统上进行深度学习代码训练调试&#xff0c;这就…

网络编程.

文章目录一、概述通信要素一&#xff1a;IP和端口号IP端口号通信要素二&#xff1a;网络协议TCP网络编程UDP网络编程URL网络编程每日一考一、概述 1、网络编程中两个主要问题&#xff1a; 如何定位网上的一台或多台主机&#xff0c;定位主机上的特定应用 找到主机后&#xff0…

北京化工大学1/17寒假集训题解(>1800)

目录 A - 文艺平衡树 B - 可持久化文艺平衡树 C - 可持久化平衡树 主要思路&#xff1a;FHQ Treap 可持久化 D - 维护数列 初始化 Insert操作 Delete操作 Reverse操作 Make-Same操作 Get-Sum操作 Max-Sum操作 懒标记的处理 E - 文本编辑器 A - 文艺平衡树 这里的…

贪心策略(二)兑换零钱(最后还得是动规)

兑换零钱(一)_牛客题霸_牛客网 兑换零钱(二)_牛客题霸_牛客网 兑换零钱(一)_牛客题霸_牛客网 描述 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要…

C++程序设计——类和对象II

一、再谈构造函数 1.构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量赋一个合适的初始值。 虽然上述构造函数调用后&#xff0c;对象中已经有了初始值&#xff0c;但是不能将其称之为类对象成员的初始化&#xff0c;构造函数…

Vue学习笔记(三)

Vue学习笔记三1.组件的引入及使用2.插槽3. 插槽三种写法3.1 第一种3.2 第二种3.3 第三种简化写法4.组件生命周期4.Vue路由1.组件的引入及使用 在components中写入组件Header.vue 在App.vue中进行引入 <template><div><!-- 组件化: 1个页面由不同的部分组合而…

excel日期函数:DATEDIF的几个实际应用公式编写

DATEDIF函数不仅可以用来计算年龄、工龄、工龄工资、项目周期&#xff0c;还可以用来做生日倒计时提醒&#xff0c;项目竣工日倒计时提醒等等。用上它&#xff0c;您再也不会缺席那些重要的日子&#xff0c;不论是亲人生日、项目竣工日&#xff0c;还是儿女的毕业典礼日。DATED…

明道云大湾区2023年季度闭门会议圆满结束

2023年1月12日&#xff0c;明道云在深圳坂田天安云谷召开明道云大湾区2023年季度闭门分享会。超过百位来自中大型企业组织的IT部门代表和业务技术专家莅临现场&#xff0c;进行了一下午的同台交流。广汽本田、深圳龙华区人民医院、民生银行及华润置地的项目代表&#xff0c;深度…

WebService最优方案选择

需求 最近&#xff0c;接触到了一个java对接C#的项目&#xff0c;使用WebService技术开发。项目已经快告一段落了&#xff0c;经过这几个月接触和使用。我有了一个清晰的认识&#xff0c;之前也调研了互联网上大部分实现的通讯&#xff0c;他们的优缺点&#xff0c;我都有一定…