Java基础数据结构之队列

news2025/2/23 3:22:38

一.什么是队列

队列是一种先进先出的数据结构,也就是从左边进从右边出,或者说,只允许在一端插入元素,在另一端删除元素

进行插入操作的一端称为队尾(tail/rear),删除操作的一段称为队头(front/head)。

二.队列的模拟实现

队列应该用链表来存放元素,因为要对头尾进行操作

成员变量:

入队:

首先要判断是否为第一次插入元素,因为要涉及到更新last的值。注意用到了尾插法

出队:

有三种情况,第一种是队列为空,第二种是只有一个元素,第三种是一般状态。注意一般状态下,不要仅仅把first往后移,虽然这样也可以,但最好勤快一点,把前后断的更干净些,不要都交给jvm去做

获取队首元素:

三.队列的使用

队列queue是一个接口

主要使用的就是它的offer方法,poll方法和peek方法

实例化队列对象:

队列的底层是链表,所以实例化队列时一般用LinkedList

有一个问题:能否通过LinkedList中的迭代器来遍历队列?不可以,向上转型的queue访问不到子类独有的方法!!

四.循环队列

循环队列的大小是固定的front表示队头,rear表示队尾,从队尾放元素,每放一个元素,rear就向前移一位,芙蓉厅始终指向第一个元素,出队时front就像前移动

我们可以发现,当队列为空时,rear和front在同一个位置,队列全满时,rear和front也指向同一位置,那怎么判断空与满呢?

1.如何判断空与满

方案一:使用usedsize来记录

方案二:浪费一个空间来表示满

比如数组有9个空,我们只使用8个空,当8个空全都使用上时rear和front就差一步,此时要是再像插入元素,rear就得再往前走,就和front相遇了,说明在放这个元素之前已经把8个空用完了,已经是满的状态了,所以这个元素不能放进去了。

而要是要删除一个元素,front往前走了一步,发现和rear相遇了,就说明空了。

所以说:rear向前走后与front相遇,就是满;front向前走后与rear相遇,就是空

也就是:

队列为空时的条件:rear=front

队列为满时的条件:rear+1=front

但仅仅这样是不对的,假设数组长度为7,现在已经放了6个元素,其实已经满了,此时front=0,rear=6,rear下一步本应是0,但rear+1=7了,不等于0,所以上面的写法不对,而应该为

队列为空时的条件:rear=front

队列为满时的条件:(rear+1)%arr.length=front

方案三:定义一个标记

设置一个flag,初始值为false

当入队时,rear向后移,flag=true;出队时front向后移,flag=false

当队列为空时front=rear并且flag=false(因为最后一步操作肯定是出队)

当队列为满时front=rear并且flag=true(因为最后一步操作肯定是入队)

2.循环队列的代码实现

class MyCircularQueue {
    public int []arr;
    public int front=0;
    public int rear=0;
    public int size;
    public MyCircularQueue(int k) {
        this.arr=new int[k];
    }
    
    public boolean enQueue(int value) {
        if(isFull()){
            return false;
        }
        arr[rear]=value;
        rear=(rear+1)%arr.length;
        size++;
        return true;
    }
    
    public boolean deQueue() {
        if(isEmpty()){
            return false;
        }
        front=(front+1)%arr.length;
        size--;
        return true;
    }
    
    public int Front() {
        if(isEmpty()){
            return -1;
        }
        return arr[front];
    }
    
    public int Rear() {
        if(isEmpty()){
            return -1;
        }
        else if(rear==0){
            return arr[arr.length-1];
        }
        else {
            return arr[rear - 1];
        }
    }
    
    public boolean isEmpty() {
        return size==0;
    }
    
    public boolean isFull() {
        return size==arr.length;
    }
}

我这里判断空与满用到的是size

首先enQueue是向队列中插入一个元素,这里就是向队尾插入元素,所以就是在rear下标插入元素,然后rear++,但这样更新rear的值不可以,比如arr.length=7,此时rear指向了6下标,那么rear加1就是7了,就是数组越界了,当rear是6时,表示它已经到了数组末尾,该往回返了,也就是应该到0下标,所以就有了(rear+1)%arr.length。但要判断是否为满。

然后是deQueue,是从队首删除一个元素,直接(front+1)%arr.length即可。还是注意是否空。但注意,要是存放的元素是某个引用类型,就要将front所指位置置为空之后再更新

Front是从队首获取元素,Rear是从队尾获取元素。注意从队尾获取元素的操作。当不为空时,一般情况下只要获取rear-1位置的元素即可,但有一种情况就是rear=0,此时rear-1=-1,下标越界了,所以rear=0时,要获取数组末尾的元素。

五.双端队列(Deque)

双端队列就是允许俩端都可以进行入队和出队操作的队列,Deque是一个接口,其实现类是LinkedList、ArrayDeque、LinkedBlockingDeque。首先LinkedList底层是链表,可以在两头进行插入删除操作,ArrayDeque底层是数组,是顺序表,也可进行。LinkedList最常用。下面是它的一些方法:

把它当队列来用,就建议使用offer,poll,peek这样的方法

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

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

相关文章

MyBatis源码分析之基础支持层异常模块

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:传送门 🍹 本人24应届生一枚,技术和水平有限&am…

mac版本的vscode如何运行html文件

1.安装Live Server扩展 需在VS中安装一个拓展插件Live Server,插件寻找方法如下: 2.编写HTML文件 3.启动Live Server 在VSCode中打开你的HTML文件,并点击右键选择"Open with Live Server",或者点击右下角的"Go…

安卓类加载机制

目录 一、ClassLoader介绍二、双亲委托机制三、类的加载过程 一、ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成,在程序运行时,需要将 class 文件加载到 JVM 中才可以使用,负责加载这些 class 文件的就是 Java 的类加…

Apache POI处理Miscrosoft Office 各种文件格式的开源项目

介绍: 应用场景 maven 坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifa…

支付宝小程序模板开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 支付宝小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一…

Java_优先级队列(堆)(Priority Queue)

文章目录 一、优先级队列1.概念 二、优先级队列的模拟1.堆的概念2.堆的存储方式3.堆的创建1、堆向下调整2、堆的创建代码实现3、建堆的时间复杂度 2.堆的插入与删除1、堆的插入2、堆的删除3、完整的堆代码4、练习 一、PriorityQueue常用接口介绍1.PriorityQueue的特性2.Priorit…

Java项目:38 springboot005学生心理咨询评估系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 学生心理咨询评估系统有管理员和用户 【主要功能】 用户管理、试题管理、试卷管理、考试管理 【技术组成】 SpringBoot MyBatis Vue Boots…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…

QT 解决在线安装版本下载速度(以国内镜像启动安装器的方式)

关于Fiddler输入steam的教程&#xff0c;本人试过&#xff0c;无效略过… 正确方式 具体操作方法&#xff1a; 1.方式一、未安装过QT 下载好安装器之后&#xff0c;在安装器&#xff08;qt-unified-windows-x64-4.6.0-online.exe&#xff09;的文件夹中空白处&#xff0c;按…

第八篇:预测受众(Predictive audience)技术是如何赋能数字化营销生态的?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒…

Covalent Network(CQT)将链下收入引入链上,在全新阶段开启 Token 回购

Covalent Network&#xff08;CQT&#xff09;&#xff0c;是 Web3 领域跨越 225 个链的领先数据索引服务商&#xff0c;通过统一 API 的方式提供结构化数据可用性服务&#xff0c;并正在成为 AI、DeFi、分析和治理等多样化需求的关键参与者。为了支持去中心化技术的采用&#…

在XCode中使用SwiftGen管理你的图片、配色、多语言文件等

SwiftGen是一个工具&#xff0c;可以为您的项目资源&#xff08;如图像、本地化字符串等&#xff09;自动生成Swift代码&#xff0c;然后你就可以像使用一个Class类一样访问你的资源了。 而且添加或更新资源后&#xff0c;SwiftGen也会自动更新用于访问资源的Class类。对于管理…

Linux性能优化总结

Part1Linux性能优化 1性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标&#xff1a;吞吐和延时 图片来自: www.ctq6.cn 应用负载角度&#xff1a;直接影响了产品终端的用户体验 系统资源角度&#xff1a;资源使用率、饱和度等 性能问题的本质就是系统资源已…

理解 JSON 和 Form-data 的区别

在讨论现代网络开发与API设计的语境下&#xff0c;理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里&#xff0c;特别值得关注的是两种主流数据格式&#xff1a;JSON与Form-data。尽管它们的终极目标一致&#xff0c;即数据传输的高效性和可靠性&#xff0c;但…

Unity接入海量RTSP直播流,多线程渲染

Unity 播放海量RTSP视频&#xff0c;多线程播放&#xff0c;长时间运行稳定 Unity 播放海量RTSP视频&#xff0c;多线程渲染 使用的libvlc库&#xff0c;目前只支持windows开发 25路视频同时播放&#xff0c;测试持续运行1晚上&#xff0c;运行稳定&#xff0c;不掉帧&#xf…

Tensorflow2.0笔记 - 计算梯度

本笔记主要记录tf.GradientTape和tf.gradient的用法 import tensorflow as tf import numpy as nptf.__version__#要计算梯度的所有参数计算过程必须放到gradient tape中 #with tf.GradientTape as tape: w tf.constant(1.) x tf.constant(2.)with tf.GradientTape() as tap…

现代信号处理学习笔记(三)现代谱估计

现代谱估计是信号处理和统计领域的一个重要主题&#xff0c;它涉及从信号中估计其频谱内容的方法。频谱表示一个信号在不同频率上的成分强度。谱估计在许多应用中都很重要&#xff0c;如通信系统、雷达、音频处理、生物医学工程等领域。 目录 前言 一、基础知识 1、功率谱估…

AI改变未来:探索人工智能在医疗领域的突破性应用

正文&#xff1a; 大家好&#xff0c;今天我要和大家分享的是人工智能&#xff08;AI&#xff09;在医疗领域的突破性应用。AI技术的快速发展正在改变着医疗行业&#xff0c;为医生和患者带来了前所未有的机遇和挑战。 首先&#xff0c;让我们来看看AI在医疗领域的几个重要应用…

C++_位图

目录 1、位图的使用 2、位图实现 3、位图与哈希表的区别 4、位图的应用 结语 前言&#xff1a; 位图采用的是哈希表的思想&#xff0c;哈希表的映射层面是在字节上&#xff0c;而位图的映射层面就是在bit位上。由于bit位所能展现的信息无非只有‘1’和‘0’&#xff0c;所…

pdf属性修改教程 如何修改pdf 属性?

PDF&#xff08;Portable Document Format&#xff09;是一种广泛使用的文件格式&#xff0c;用于呈现文档&#xff0c;包括文本、图像、图形和其他元素。PDF文件的一个特点是其属性&#xff0c;这些属性包括文件的创建日期、修改日期、作者、标题、主题、关键词等。这些属性在…