关于队列的简单理解

news2024/11/27 0:48:58

1.队列(Queue) 

1.1 关于队列

        队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表, 队列具有先进先出 FIFO(First In First Out)的操作特性(队列是个接口);
        入队列:进行插入操作的一端称为队尾( Tail/Rear )
        出队列:进行删除操作的一端称为队头( Head/Front )

        下图通过图解来了解关于队列入队和出队的操作;

1.2队列与链表

        在Java中,Queue是个接口,底层是通过链表实现的 ,具体情况如下图所示;​​​
        

1.3 队列的基本使用方法

        下图是使用队列时具体的基本方法;

        注意:Queue是个接口,在实例化时该接口时,必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。 

2.用链表实现队列

        我们本次使用的是双向链表;

2.1创建队列

public class MyLLQueue {
    //创建静态内部类,实例对象作为队列中的节点
    public static class Node {
        int value;
        Node next;
        Node prev;

        public Node(int value) {
            this.value = value;
        }
    }

    public Node front;//双向链表的头结点
    public Node rear;//双向链表的尾结点
    public int usedSize = 0;//记录队列中节点个数
}

2.2入队列

        思路:

        1、创建一个要添加的值为value的节点node。

        2.1判断当前队列是否为空?即链表头结点front是否为null,若为null,则该node既是front(队头)和也是rear(队尾)。

        2.2若队头不为null,则将该节点的引用给当前队列的队尾的next,至此队尾就是我们新添加的节点;

        4、队列里面的数据容量加一。

        代码如下:

public boolean offer(int vale) {
            Node node = new Node(vale);
            if (isEmpty()) {
                front = node;
                rear = node;
            } else {
                rear.next = node;
                node.prev = rear;
            }
            rear = node;
            usedSize++;
            return true;
        }

2.3 判断队列是否为空

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

 2.4出队列

        1、队列为空,则直接返回队列为空的自定义异常。

public class EmptyException extends RuntimeException{
    public EmptyException(String msg) {
        super(msg);
    }
}

        2、队列此时不为空。

        2.1 此时队列中只有一个元素;(即队头的next域里存放的是空指针null),出队操作之后队列就为空,故此让队头和队尾都指向空指针;

        2.2 此时队列中有多个元素:让队头的后域指向下一个节点,队头的前域指向空指针;

        3、队列里面的数据容量减一;

//出队列---将双向链表第一个节点删除掉,并返回第一个删除节点的值
        public int poll() {
            // 1. 队列为空
            // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
            // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
            if (isEmpty()) {
                //队列为空,抛异常,提示不能对空队列进行出队操作
                throw new EmptyException("队列为空,操作错误!!");
            }
            //用ret记录返回的队头元素的数据
            int ret = front.value;
            if (front.next == null) {
                //当前链表只有一个节点
                front = null;
                rear = null;
                usedSize--;
                return ret;
            }
            front = front.next;
            front.prev = null;
            usedSize--;
            return ret;
        }

2.5获取队头元素 

        思路类似于2,4部分

//获取队头元素的值,不出队列
    int peek(){
        if (isEmpty()) {
            //队列为空,抛异常,提示不能对空队列进行出队操作
            throw new EmptyException("队列为空,操作错误!!");
        }
        return front.value;
    }

2.6 双向链表(linkedlist)实现队列的完整代码

public class MyLLQueue {
    //创建静态内部类,实例对象作为队列中的节点
    public static class Node {
        int value;
        Node next;
        Node prev;

        public Node(int value) {
            this.value = value;
        }
    }

        public Node front;//双向链表的头结点
        public Node rear;//双向链表的尾结点
        public int usedSize = 0;//记录队列中节点个数

        //为了体现队列的先进先出特点,规定从尾入,从头出(也可以头进尾出)
        //插入操作,原理为双链表的尾插法
        public boolean offer(int vale) {
            Node node = new Node(vale);
            if (isEmpty()) {
                front = node;
                rear = node;
            } else {
                rear.next = node;
                node.prev = rear;
            }
            rear = node;
            usedSize++;
            return true;
        }

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

        //出队列---将双向链表第一个节点删除掉,并返回第一个删除节点的值
        public int poll() {
            // 1. 队列为空
            // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
            // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
            if (isEmpty()) {
                //队列为空,抛异常,提示不能对空队列进行出队操作
                throw new EmptyException("队列为空,操作错误!!");
            }
            //用ret记录返回的队头元素的数据
            int ret = front.value;
            if (front.next == null) {
                //当前链表只有一个节点
                front = null;
                rear = null;
                usedSize--;
                return ret;
            }
            front = front.next;
            front.prev = null;
            usedSize--;
            return ret;
        }

    //获取队头元素的值,不出队列
    int peek(){
        if (isEmpty()) {
            //队列为空,抛异常,提示不能对空队列进行出队操作
            throw new EmptyException("队列为空,操作错误!!");
        }
        return front.value;
    }

    //获取队列的长度
    public int size(){
        return usedSize;
    }

    public static void main(String[] args) {

        MyLLQueue myLLQueue = new MyLLQueue();
        System.out.println(myLLQueue.isEmpty());
        myLLQueue.offer(1);
        myLLQueue.offer(2);
        myLLQueue.offer(3);
        System.out.println(myLLQueue.size());
        System.out.println(myLLQueue.peek());
        System.out.println(myLLQueue.poll());
        System.out.println(myLLQueue.peek());
        System.out.println(myLLQueue.size());
    }
}

        测试结果如下:

           

3. 双端队列 (Deque)

        双端队列(deque):是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

        Deque是一个接口,与queue类似在使用时必须创建LinkedList的对象,以下是详细图解:

        在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口,代码如下:

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

ps:本次内容就到这里,如果喜欢的话就请一键三连哦!!!

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

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

相关文章

解密IIS服务器API跨域问题的终极解决方案

在当今数字化时代&#xff0c;API已成为现代应用程序的核心组件。然而&#xff0c;当你使用IIS&#xff08;Internet Information Services&#xff09;服务器提供API时&#xff0c;你可能会遇到一个常见的挑战&#xff1a;API跨域问题。这个问题经常困扰着开发人员&#xff0c…

理解依赖注入

1 回顾Spring IoC容器 1.1 Spring IoC容器 Web应用程序由大量的程序组件组成&#xff0c;这些组件一起工作完成业务逻辑的执行。 这些组件通常是一个依赖另一个&#xff0c;互相协作实现所需功能。 Spring提供容器&#xff0c;也就是IoC容器&#xff0c;来管理这些组件&…

【隐私计算】安全三方计算(3PC)的加法和乘法计算协议

ABY3中采用replicated secret sharing&#xff08;复制秘密分享&#xff09;机制&#xff0c;即2-out-of-3秘密分享&#xff0c;三个参与方的每一方都拥有share中的两份。下面来看一下这样做有什么好处。 2-out-of-3秘密分享 有 x , y x, y x,y两个操作数&#xff0c;先进行秘…

rcssci包横空出世,限制性立方样条全自动切点靓图

z致敬前辈:R语言统计与绘图 仅以本篇2800字真文一并纪念工作11年来潦倒的收入、间歇的鸡血、憋屈的倔强、幽暗的过往和心中的远方。 1 缘起 Restricted cubic splines (RCS)近年来火遍各类SCI期刊&#xff0c;初次接触的小伙伴们可以去搜索笔者前期的2篇RCS文章补充一下基础知…

Android wifi disable分析

总体流程 老套路基本不变&#xff1a; WifiSettings 通过 WifiManager 下cmd 给 WifiServiceWifiService 收到cmd后&#xff0c;先完成一部分列行检查&#xff08;如UID的权限、是否airPlayMode等等&#xff09;&#xff0c;之后将cmd下发给到WifiControllerWifiController 收…

ORACLE数据库实验总集 实验三 Oracle数据库物理存储结构管理

一、实验目的 &#xff08;1&#xff09;掌握 Oracle数据库数据文件的管理 &#xff08;2&#xff09;掌握 Oracle数据库控制文件的管理 &#xff08;3&#xff09;掌握 Oracle数据库重做日志文件的管理 &#xff08;4&#xff09;掌握 Oracle数据库归档管理&#xff0c; 二、…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中&#xff0c;用户发送请求&#xff0c;然后到缓存中查询数据。如果缓存中不存在数据的话&#xff0c;就会去数据库查询数据。数据库中有的话&#xff0c;就会更新缓存然后返回数据&#xff0c;数据库中也没有的话就会给用户返回一个空。 1.缓…

springboot整合阿里云oss上传图片,解决无法预览的问题

1.前置工作 需要申请一个域名,需要备案&#xff0c;对接这个踩了不少坑,写的很详细,guan fang tong guo bu 了,各位参考别的博客结合看吧,主要是域名配置,还有看service里面的实现 2.进入控制台 bucket列表 选择bucket 选择域名管理 复制你申请的域名,比如域名:abkhkajs…

苹果iOS免签应用打包,书签类顶部域名如何隐藏?

在iOS开发中&#xff0c;由于App Store的严格审核流程和各种政策限制&#xff0c;免签打包成为一些企业和开发人员选择的方案&#xff0c;以便更灵活地分发iOS应用。在这个过程中&#xff0c;许多开发者希望隐藏或最小化安装过程中顶部域名的显示&#xff0c;以提供更加原生的用…

家用洗地机哪个品牌最好最实用?热门洗地机测评

随着社会的不断进步&#xff0c;我们逐渐意识到日常生活中的许多任务需要消耗大量的时间和体力。一个典型的例子是卫生清洁工作&#xff0c;尤其是在大面积地区&#xff0c;如大型建筑物、商场或工厂。这些任务不仅繁琐&#xff0c;还可能影响生活质量和工作效率。为了应对这一…

Hadoop学习笔记(HDP)-Part.06 安装OracleJDK

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

给腰不好的朋友设计和制作一个捡羽毛球的辅助装置

我们知道羽毛球运动不挑场地&#xff08;有防风塑料球和业余使用的网子可以购买&#xff09;&#xff0c;不需要专业器材和场地&#xff0c;不需要跑多远就可以开展&#xff0c;非常方便普通人锻炼。 而且针对现在的不良生活方式&#xff1a;久坐&#xff0c;看电脑手机&#…

unity 2d入门飞翔小鸟按钮点击功能且场景切换(二)

1、素材包获取 链接: https://pan.baidu.com/s/1KgCtQ_7wt2mlbGbIaMVvmw 提取码: xxh8 2、将素材全部拉进去 3、创建新的场景 并且将场景添加到build settings里面 4、脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE…

JOSEF 单相电压继电器 WY-31A1 DC220V 过压动作,导轨安装

系列型号 单相 JY-45A1电压继电器&#xff1b;JY-45B1电压继电器&#xff1b; JY-45C1电压继电器&#xff1b;JY-45D1电压继电器&#xff1b; JY-41A1电压继电器&#xff1b;JY-41B1电压继电器&#xff1b; JY-41C1电压继电器&#xff1b;JY-41D1电压继电器&#xff1b; …

计算机毕业设计 基于SpringBoot的大学生双创竞赛项目申报与路演管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

深入探讨Guava的缓存机制

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Google Guava的缓存机制。缓存在现代编程中的作用非常大&#xff0c;它能提高应用性能&#xff0c;减少数据库压力&#xff0c;简直就是性能优化的利器。而Guava提供的缓存功能&#xff0c;不仅强大…

【开源】基于JAVA的城市桥梁道路管理系统

项目编号&#xff1a; S 025 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S025&#xff0c;文末获取源码。} 项目编号&#xff1a;S025&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…

数据结构(超详细讲解!!)第二十六节 图(中)

1.存储结构 1.邻接矩阵 图的邻接矩阵表示法&#xff08;Adjacency Matrix&#xff09;也称作数组表示法。它采用两个数组来表示图&#xff1a; 一个是用于存储顶点信息的一维数组&#xff1b;另一个是用于存储图中顶点之间关联关系的二维数组&#xff0c;这个关联关系数组被…

基于ROPNet项目训练modelnet40数据集进行3d点云的配置

项目地址&#xff1a; https://github.com/zhulf0804/ROPNet 在 MVP Registration Challenge (ICCV Workshop 2021)&#xff08;ICCV Workshop 2021&#xff09;中获得了第二名。项目可以在win10环境下运行。 论文地址&#xff1a; https://arxiv.org/abs/2107.02583 网络简介…

vue2项目中添加字体文件

vue2项目中添加字体文件 1、下载相关文件&#xff0c;放置文件夹中&#xff0c;这里我是在assets文件中新建了fontFamily 2、在assets文件中新建css文件 3、在页面中使用 <style lang"less" scoped> import ../../assets/css/fonts.less;.total-wrap {displa…