【数据结构】队列与Queue接口

news2024/11/8 18:33:30

目录

一、队列

二、 Java里的Queue接口

1、概述

2、常用方法

1.入队

2.出队

3.获取队首元素

4、判空

三、单链表实现队列

1、准备字段

2、实现入队

3、实现出队

4、实现获取队首元素

5、实现判空

四、循环队列的实现

1、前言

2、字段准备

3、实现入队

4、实现出队

5、实现判空

6、实现获取队首元素

一、队列

队列是一种操作受限的线性表,它与栈不同的是,栈是特点是先进后出而队列是先进先出,比如排队买早饭,先到先排到前面的人先买到先走。队列这一数据结构只允许在队首出数据,在队尾插入数据。

 

二、 Java里的Queue接口

1、概述

在Java里Queue是一个接口,其内部方法主要有入队出队等,有很多实现他的类比如我们之前说到过的LinkedList,在Java里队列的使用可以分为阻塞队列(BlockingQueue)与非阻塞队列还有双端队列(Deque),一般多线程情况下我们常常使用阻塞队列实现生产者消费者模型

2、常用方法

 

1.入队

方法说明
offer入队失败返回false
add入队失败抛出异常

2.出队

方法说明
poll队空出队返回空指针
remove队空出队抛出异常

3.获取队首元素

方法说明
peek队空时返回空指针
element队空时抛出异常

4、判空

方法说明
isEmpty判断队列是否为空

三、单链表实现队列

1、准备字段

单链表实现队列时,需要连个指针一个指向队首一个指向队尾

public class MyQueueByList {
    public Node first;    //队首指针
    public Node last;     //队尾指针
    
}

2、实现入队

入队操作就是插入到队尾,也就是单链表的尾插操作

 

3、实现出队

出队操作是将队首元素删除然后返回其值,类似于单链表删除头节点

4、实现获取队首元素

与出队操作不同的是该操作不用删除

 

5、实现判空

当队首节点为空时队列为空

 

四、循环队列的实现

1、前言

如果使用普通的数组去实现队列这一数据结构时,会有一个很严重的问题----内存浪费。如果我们使用普通数组实现时,初始长度为5,那么我们先入队5个元素,然后此时在入队时需要扩容,但是如果在满的情况下出队后再入队,此时由于要在队尾插入,还是需要去扩容,然后下标为0的空间则被浪费,循环往复内存浪费严重,如果我们能将数组“卷”起来变成一个“⚪”

此时如果有上述情况,在入队时直接插入进0下表依次类推。此处又存在一个问题,就是我们如何去区别队列到底是满了还是为空,空的时候队首下标与队尾下标相同,满时也一样,这一问题有多个解决办法,以下使用浪费一个空间的办法,就是在数组的最后一个位置不插入元素,此时如果队首与队尾下标相同时为空,如果队尾下标的下一个与队首下标相同则为满

2、字段准备

基于上述情况,我们需要一个数组,一个指向队首的下标,一个指向队尾的下标

public class MyQueueByArray {
    private int[] elem;           //数组
    private int front;            //队首下标
    private int rear;             //队尾下标
}

3、实现入队

此时我们需要处理的点有:如果队列数组长度为5,当下标4的位置有数据而下标为0的位置没有元素,再插入时理应插入下标0位置,但是怎么让队尾下标变为0呢,有两种办法一种是,每次插入后判断一些队尾下标是不是4了,如果是4就在if语句里置为0;第二个办法是,每次入队操作后队尾下标自增改为 (队尾下标+1) % 数组的长度。下面出队操作也有以下情况。

/**
     * offer
     * @param data
     */
    public void offer(int data){
        if(isFull()){
            return;
        }
        
        elem[rear] = data;
        rear = (rear + 1) % elem.length;
    }

    /**
     * 判空
     * @return
     */
    public boolean isEmpty(){
        return front == rear;
    }

    /**
     * 判满
     * @return
     */
    private boolean isFull(){
        return (rear + 1) % elem.length == front;
    }

4、实现出队

出队将队首元素记录并将队首下标自增删除,此处删除并不是将数据正在删除,而是改变队首下标让其被标志为一个空的位置

/**
     * poll
     * @return
     */
    public Integer poll(){
        //1.判空
        if(isEmpty()){
            return null;
        }

        //2.出队
        int frontValue = elem[front];
        front = (front + 1) % elem.length;

        //3.返回值
        return frontValue;
    }

5、实现判空

由于我们使用了浪费一个空间的办法,因此空时队首下标与队尾下标相同

/**
     * 判空
     * @return
     */
    public boolean isEmpty(){
        return front == rear;
    }

6、实现获取队首元素

根据队首下标获取队首元素

 /**
     * peek
     * @return
     */
    public Integer peek(){
        //1.判空
        if(isEmpty()){
            return null;
        }

        //2.返回队首元素
        return elem[front];
    }

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

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

相关文章

一致性哈希

一、简介 这个算法是一种特殊的哈希算法,目的是解决分布式缓存的问题。 普通哈希算法在分布式存储具有较大的局限性,简单的讲就是难以扩展。 一致性哈希相对而言具有较好的容错性和可扩展性,更加适合现在的分布式存储。 二、经典哈希版本 …

SpringBoot+Vue项目实践课程教学管理平台

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

✿✿✿JavaScript --- JSON

目录 1.JSON的简介 2.JSON的语法规则 3.JSON 字符串转换为 JavaScript 对象 4.常用的JSON相关的函数 5.JSON对象的遍历 6.补充:JS中的this关键字 1.JSON的简介 JSON( JavaScript Object Notation ) 是用于存储和传输数据的格式&#xf…

Android studio配置大内存,编译速度更快!

本文使用的是windows 10系统,Android studio 版本是Android Studio Chipmunk | 2021.2.1(松鼠) 目录为什么要配置大内存?默认内存是多少?如何扩大内存配置?这个配置保存在哪个文件?文件在哪里&a…

二叉树10:二叉树的最小深度

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:111. 二叉树的最小深度 题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近…

Asp.Net Core实现最基本的Http服务

概述 和.NetFramework时代不同,Core是可以自承载的,也就说开发好的Web项目,可以打包成exe直接运行的,而不必放到IIS这样的环境中。接下来,我们写点代码,体验一下Asp.Net Core自带的Http功能。 初体验 所谓…

嵌入式微功耗RTU的功能与特点介绍、技术参数详情

平升电子嵌入式微功耗RTU,可灵活嵌入至各类仪表、传感器和工业设备中,定时采集设备数据并通过4G/5G/NB-IoT远传至监管软件,实现设备联网。 嵌入式微功耗RTU设计小巧、方便集成,微功耗运行,支持标准水资源/水文/环保/M…

Biotin-PEG-AC,Biotin-PEG-Acrylate,生物素PEG丙烯酸酯线性杂双功能PEG试剂

英文名称:Biotin-PEG-AC,Biotin-PEG-Acrylate 中文名称:生物素-聚乙二醇-丙烯酸酯 生物素-聚乙二醇-丙烯酸酯是一种含有生物素和丙烯酸酯的线性杂双功能聚乙二醇试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。生物素能与亲和素和…

智创万物,数赢未来——如何助推数智时代的发展浪潮

数智化核心特征 可视化 消费者的行为可以看得见,生产者的行为也可以看得见。产业互联网或者消费互联网非常重要的一点就是要对消费者行为和生产者行为的可视化,其背后是数字化的力量。 可量化 可量化意味着企业家可以对管理流程进行改造,…

echarts的legend——图例样式的配置

认识图例: 以上几张图表中,红色圆圈部分即图例 echarts图表中的图例,有形状,颜色,位置等等各种样式的不同配置。 echarts官网配置项手册里有非常详细的内容,我们挑几种常用的看看,加深对legend属…

深度学习——物体检测算法:R-CNN,SSD,YOLO(笔记)

一,R-CNN 1.区域卷积神经网络R-CNN 首先从输入图像中提取若干个锚框,并标注好它们的类别和偏移量。然后用卷积神经网络对每一个锚框进行前向传播抽取特征。最后用每个提议区域的特征来预测类别和边界框。 ①使用启发式搜索算法来选择锚框 ②使用预训练…

【第一周学习——认识 O(N*logN) 的排序[ 归并排序 、堆排序、快速排序 ]

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:《数据结构与算法》 📧如果文章知识点有错误的地方&a…

力扣(LeetCode)187. 重复的DNA序列(C++)

哈希表 直观思考,由于限定了答案长度 101010 ,只需要一次遍历字符串,统计所有长度为 101010 的子串的出现次数(哈希表) ,最后遍历哈希表,维护答案,记录出现 222 次(及以上)的字符串 。 class Solution { …

【BBuf的CUDA笔记】二,解析 OneFlow BatchNorm 相关算子实现

0x1. 前言 在ResNet中(https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py),关于BatchNorm的调用一共有两种模式,第一种是ReLU接在BN之后: out self.bn1(out) out self.relu(out)另外一种…

MicFunPred——最新16S rRNA扩增子数据功能预测数据库

近年来,基于扩增子测序进行物种的功能预测是研究微生物群落功能的主要方面,目前最常用的软件包括Tax4Fun以及PICRUSt2。关于这两款软件的使用方法详可参见凌波微课|扩增子研究第十六讲:扩增子测序结果中的物种功能预测。 Tax4Fun使用最近邻匹…

2022年终总结-两年Androider的成长之路

金句分享 生活金句 1.可难道我们生命中做的每一件事不都是为了被爱得更多一点吗 2.这不只是一种对承诺的恐惧,也不是我缺乏关心和爱的能力,因为我做得到,只不过,老老实实讲。我想 我宁愿为了某件我擅长的事,我能表现…

一个select死锁问题

以下代码的输出结果&#xff1a; func main() {var wg sync.WaitGroupfoo : make(chan int)bar : make(chan int)wg.Add(1)go func() {defer wg.Done()select {case foo <- <-bar:default:println("default")}}()wg.Wait() }结果 解析 对于 select 语句&#…

【Linux】进程信号

目录 一、什么是信号 二、信号产生的条件 1、键盘产生 2、进程异常 3、命令产生 4、软件条件 三、信号保存的方式 四、信号处理的方式 1、信号处理接口 2、信号处理时机 3、进程为什么要切换成为用户态才进行信号的捕获方法&#xff1f; 4、sigaction 五、可重入函…

Java+MySQL基于ssm的会议交接平台

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

信贷产品年终总结之贷后逾期分析

自本月月初疫情全面放开后&#xff0c;身边的朋友基本都阳了一遍&#xff0c;希望正在浏览本篇文章的读者您是还没阳过的幸运儿。另外&#xff0c;今天也是冬至了&#xff0c;祝各位读者身边健康&#xff0c;远离羊群&#xff01; 最近我们分享了信贷业务年终总结系列的前2篇文…