Queue 队列的实现与应用

news2024/11/26 10:39:14

目录

    • 1.概念
    • 2.常用的队列方法
      • 2.1 方法
      • 2.2 代码
    • 3.自己实现队列
      • 3.1 构造MyQueue
      • 3.2 入队列offer()
      • 3.3 出队列poll()
      • 3.4 获得队头peek()
      • 3.5 是否为空isEmpty()
      • 3.6 获得队列大小size()
    • 4.循环队列
      • 4.1 概念
      • 4.2 解析
      • 4.3 如何判断队列满
      • 4.4 代码(保留一个位置实现)

1.概念

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队(Head/Front),队列可以通过数组和链表两种方式来实现。
队列的基本操作:入队(Offer)、出队(Poll)和获取队头元素(Peek)。其中,入队操作将元素放到队尾,出队操作将对头元素移除并返回其值,获取队头元素则是获取栈顶元素的值但是不移除队头元素。
另外,队列还有一些其他的常用操作,如:判断队列是否为空(IsEmpty)、获取队列中元素的个数(Size)、清空队列中的所有元素(Clear)等。

FIFO

2.常用的队列方法

2.1 方法

方法功能
offer()入队列
poll()出队列,队列为空,抛出NoSuchElementException异常
peek()获得队头元素,抛出NoSuchElementException异常
size()获得队列元素个数
isEmpty()检测队列是否为空

2.2 代码

    public static void main(String[] args) {
        Queue<Character> queue = new LinkedList<>();
        queue.offer('A');//A
        queue.offer('B');//B A
        queue.offer('C');//C B A
        System.out.println(queue.poll());//A
        System.out.println(queue.peek());//B
        System.out.println(queue.poll());//B
        queue.offer('D');//D C
        System.out.println(queue.size());//2
        System.out.println(queue.isEmpty());//fasle
    }

注意:
队列操作的poll(),peek()的执行条件是队列不为空。

3.自己实现队列

自己实现队列可以使用线性结构和链式结构实现,具体使用哪种结构取决于实际需求和场景。
顺序结构的优点是实现简单,易于理解和维护,内存利用率高,适用于元素个数固定、连续存储空间较大时的情况。但是,在元素插入和删除时需要移动大量元素,所以当队列操作频繁时,效率可能较低。
链式结构的优点是插入和删除操作时只需修改指针,效率较高,适用于元素个数不确定、动态增长的情况。但是,链式结构需要更多的内存空间来存储指针,且代码实现相对复杂,对于较小的队列可能会浪费一些内存空间。
因此,根据具体需求和场景来选择队列的实现方式。队列可以使用顺序结构和链式结构来实现,具体使用哪种结构取决于实际需求和场景。
顺序结构的优点是实现简单,易于理解和维护,内存利用率高,适用于元素个数固定、连续存储空间较大时的情况。但是,在元素插入和删除时需要移动大量元素,所以当队列操作频繁时,效率可能较低。
链式结构的优点是插入和删除操作时只需修改指针,效率较高,适用于元素个数不确定、动态增长的情况。但是,链式结构需要更多的内存空间来存储指针,且代码实现相对复杂,对于较小的队列可能会浪费一些内存空间。
因此,根据具体需求和场景来选择队列的实现方式。

3.1 构造MyQueue

我们可以使用链表构建队列,链表是节点组成,所以我们创建节点,用next记录下一个节点,prev记录前一个节点。

public class MyQueue {
    public int val;
    public MyQueue next;
    public MyQueue prev;
    public MyQueue first;//队头
    public MyQueue last;//队尾
    public int size;//元素个数
    public MyQueue(){}
    public MyQueue(int val){
        this.val = val;
    }
}    

3.2 入队列offer()

入队列的时候,如果队列大小为0,则队头队尾都等于这个节点。不为0,则直接队尾插入这个节点。

    //入队列
    public void offer(int val){
        MyQueue myQueue = new MyQueue(val);
        if(size == 0){
            first = myQueue;
            last = myQueue;
            size++;
            return;
        }
        last.next = myQueue;
        myQueue.prev = last;
        last = last.next;
        size++;
    }

3.3 出队列poll()

出队列的时候,判断队列大小是否为0,为零则抛出异常,不为0则删除队头元素,并返回。

    //出队列
    public int poll(){
        if(first == null){
            throw new NoSuchElementException();
        }
        MyQueue myQueue = first;
        if(first == last){
            last = null;
            first = null;
        }else {
            first = first.next;
            first.prev = null;
        }
        size--;
        return myQueue.val;
    }

3.4 获得队头peek()

获得队头元素,若队列为空,直接抛出异常,反之直接返回队头元素。

    //获得队头元素
    public int peek(){
        if(first == null){
            throw new NoSuchElementException();
        }
        return first.val;
    }

3.5 是否为空isEmpty()

判断队列是否为空,就是判断size是否为0。

    //是否为空队列
    public boolean isEmpty(){
        return size == 0;
    }

3.6 获得队列大小size()

获得队列大小,直接返回size即可。

    //队列元素个数
    public int getSize(){
        return size;
    }

4.循环队列

4.1 概念

用数组来实现,是一种队列数据结构,它通过维护两个指针front和rear,使得在队列头和队列尾之间形成一个环状的结构。当队列满时,新元素无法插入队列,但是可以从队头删除元素来腾出空间。与普通队列相比,循环队列可以更有效地利用存储空间。另外,循环队列还有一些特殊操作,如队列的遍历和求队列长度,它们需要特殊的算法来实现。

4.2 解析

  1. MyCircularQueue类有三个私有成员变量:elem表示循环队列的存储数组,front、rear分别表示队头和队尾的位置。
  2. 构造函数MyCircularQueue(int capacity)用于创建一个容量为k的循环队列。在构造函数中,初始化存储数组elem、队头front、队尾rear。
  3. enQueue方法用于向队列中添加元素element。如果队列已满,则返回false;否则将元素添加到队尾,并将队尾指针rear移动到下一个位置,同时更新队列大小size。注意,队列满时,rear可能会回到数组的开始位置,这时可以用取模运算实现。rear = (rear + 1) % elem.length;
  4. deQueue()方法用于从队列中删除元素,并返回被删除的元素。如果队列为空,则抛出NoSuchElementException。否则将队头元素删除,并将队头指针front移动到下一个位置。同样地,如果队头指针front回到数组的开始位置,则也需要用取模运算实现。frond = (frond + 1) % elem.length;
    peek()方法用于返回队头元素,但不删除它。如果队列为空,则抛出NoSuchElementException。
    xunhuan

4.3 如何判断队列满

  1. 通过添加 size 属性记录(当size等于队列长度,满)
  2. 保留一个位置(当队尾加1 mod 队列长度等于队头,队列满)
  3. 使用标记(在循环队列中添加一个标记 flag,用来区分队列空和队列满的状态。)

4.4 代码(保留一个位置实现)

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

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

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

相关文章

vue+nodejs校园二手物品交易市场网站_xa1i4

。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的校园二手交易市场&#xff0c;使用vue框架&#xff0c;Mysql数据库、nodejs语言进行开发&#xff0c;它的优点代码不能从浏览器查看&#xff0c;保密性非常好&#xff0c;比其他的管理…

轻松实现动态人脸识别,AidLux加速智慧城市场景化应用落地

随着AI技术进入全新发展阶段&#xff0c;智能物联网&#xff08;AIoT&#xff09;的渗透率进一步加深&#xff0c;应用场景不断拓展&#xff0c;人脸识别也迅速走进了人们的日常生活&#xff0c;在手机解锁、公司考勤、支付验证、天网抓捕在逃嫌犯等场景中发挥着重要作用。 人脸…

dataV教程-浅用dataV

一别多日&#xff0c;好久没有和大家相见了。其一的原因是因为公司的项目&#xff0c;其二就是因为太懒了。现在给大家浅浅的介绍一下这个好用的大屏展示框架吧。如果后续有深入的话&#xff0c;我会出一个详解版本的。 一、dataV介绍 前言:由于当前的大数据时代&#xff0c;…

Github标星60K!mall前台商城系统正式发布,支持完整订单流程!

之前有很多小伙伴问我&#xff0c;mall项目有没有前台商城系统&#xff0c;可见大家对mall项目的前台商城系统还是非常期待的。最近抽空把前台商城系统的功能给完善了&#xff0c;目前已经可以支持完整的订单流程。我已经把前台商城系统开源了&#xff0c;项目地址也放在文末了…

重磅发布!面向装备制造业服务化转型白皮书(私信获取)

《面向装备制造业服务化转型白皮书》 关于白皮书 《面向装备制造业服务化转型白皮书》通过调研160余家装备制造企业的服务化路径及模式&#xff0c;研讨支持企业开展服务型制造的系统化方案&#xff0c;希望为装备制造业服务化转型&#xff0c;探索切实有效的路径以供参考。 …

【MySQL】- 02 MySQL explain执行

目录 1.使用explain语句去查看分析结果2.MYSQL中的组合索引3.使用慢查询分析&#xff08;实用&#xff09;4.MYISAM和INNODB的锁定explain用法详解关于MySQL执行计划的局限性&#xff1a;备注&#xff1a; 1.使用explain语句去查看分析结果 如explain select * from test1 whe…

nSoftware IPWorks 2022 C++ Crack

nSoftware IPWorks 2022 C最全面的互联网组件套件&#xff0c;PKI 代理远程签署代码和文档&#xff0c;无需暴露您的私钥&#xff0c;一种安全的自托管解决方案&#xff0c;可使用集中存储的密钥实现远程代码和文档签名&#xff0c;随附的 PKCS#11 驱动程序允许与 Jarsigner、S…

小航助学题库蓝桥杯stem科技素养模拟练习试卷(中级第2套)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 25. 2020 年 7 月 23 日&#xff0c;中国的火星探测器“天问一号“发射&#xff0c;开始了前往火星的 旅程。作为中国首个完全自主研发…

Vue之条件渲染

1. if分支结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

【分享】如何国内免费使用ChatGPT4教程

一、ChatGPT-3使用 1、ChatGPT用法总结&#xff1a; 自动化文本生成&#xff1a;可以用GPT生成文章、新闻、文本摘要&#xff0c;甚至小说、诗歌等文学作品。语音生成&#xff1a;结合语音合成技术&#xff0c;GPT可以生成自然流畅的语音&#xff0c;可以用于语音助手、交互式…

Python学习——数据排序及分箱pd.cut\pd.qcut

文章目录 1 排序1.1 按照索引排序 df.sort_index1.2 按照值进行排序 df.sort_values1.3 数值型数据快速排序 df.nlargest 2 分箱&#xff08;离散化&#xff09;2.1 pd.cut2.1.1 均匀切分,等距分箱2.1.2 指定切分点切分 2.2 pd.qcut 1 排序 dataFrame进行排序时&#xff0c;可…

最全面的WMS系统选购指南:从功能到价格一网打尽

WMS&#xff08;仓库管理系统&#xff09;是一款能够提高仓储和物流企业效率的重要工具&#xff0c;并且能够帮助客户更好地管理他们的供应链网络。但是市面上有很多不同的WMS系统&#xff0c;如何选出最适合自己的系统呢&#xff1f;下面将为您介绍全面的WMS系统选购指南。 功…

软件工程师,不懂点设计模式怎么行

设计模式的圣经 提起设计模式&#xff0c;就不得不提《设计模式——可复用面向对象软件的基础》这本经典著作。1995年&#xff0c;GOF&#xff08;Gang Of Four&#xff09;&#xff0c;也就是Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides这四个人&#xff0c;合…

感谢你们为科技创新和社会进步做出的贡献

感谢你们为科技创新和社会进步做出的贡献 近日中国科技发展事件 据中国载人航天工程办公室消息&#xff0c;北京时间2023年5月30日6时42分&#xff0c;神舟十六号载人飞行任务航天员乘组出征仪式在酒泉卫星发射中心问天阁圆梦园广场举行。6时44分&#xff0c;中国载人航天工程…

Linux:虚拟网卡技术tun/tap

一、介绍 Linux中的TAP网络接口详解是Linux网络管理中的很重要的一部分&#xff0c;它可以用来建立虚拟网络&#xff0c;模拟网络&#xff0c;管理网络流量以及实现安全网络功能等。本文将介绍TAP网络接口的基本原理、如何使用它进行网络管理、与以太网的区别&#x…

在 I/O 看未来 | Flutter 和 Dart 最新进展

作者 / Google 开发者框架和语言 (含 Flutter、Dart 和 Go) 产品经理/用户体验总监 Tim Sneath 今年的 Google I/O 大会在位于加利福尼亚州山景城的总部附近举办&#xff0c;我们怀着无比激动的心情面向全球直播了这场盛会&#xff01; 就在三个多月前&#xff0c;我们在肯尼亚…

软考A计划-试题模拟含答案解析-卷十二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

带电接10kV空载电缆线路与架空线路连接引线(绝缘手套作业法)

一、现场复勘 1.核对线路及杆塔号 线路双重名称及杆号无误。 2.检查杆身质量 3.检查电杆埋深 4.检查导线固定情况 检查作业点导线有无烧伤、断股。 5.检查气象条件 作业前需进行湿度和风速的测量&#xff0c;风力大于5级&#xff0c;或湿度大于80%时&#xff0c;不宜带电作…

Microsoft Build 2023 After Party - 上海站

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

企业级信息系统开发讲课笔记4.4 Spring Boot加载自定义配置文件

文章目录 零、学习目标一、为什么需要加载自定义配置文件二、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测…