Java_队列(Queue)详解

目录

前言

队列(Queue)

概念

队列的使用

循环队列

循环队列的构思

代码的实现

双端队列(Deque)

概念

方法

 双端队列的使用


前言

超详细地讲解了循环队列,为什么要有循环队列 , 普通队列 , 双端队列

队列(Queue)

概念

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

先入先出,后入后出  与栈正好相反


 

 跟现实生活中的排队一样:

 

队列的使用

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口(队列底层是链表实现的)

public static void main(String[] args) {
    Queue<Integer> q = new LinkedList<>();
    q.offer(1);
    q.offer(2);
    q.offer(3);
    q.offer(4);
    q.offer(5); // 从队尾入队列
    System.out.println(q.size());
    System.out.println(q.peek()); // 获取队头元素
    q.poll();
    System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
    if(q.isEmpty()){
        System.out.println("队列空");
    }else{
        System.out.println(q.size());
    }
}

循环队列

特点以及为什么要有循环队列

循环队列底层是数组,具有内存固定效率高等特点

直接用链表来当队列底层,固然很方便,但我们也知道链表在添加节点的时候需要动态分配内存,这个过程是比较耗费资源和时间的

因此如果我们的队列长度固定,又想要有较高的性能,那么就可以用顺序表示方式的队列(循环队列应运而生)

若用户无法预估队列的具体长度,那么用链队列是比较方便的,因为链表的好处就是可以很方便地添加和删除新的节点

循环队列的构思

代码的实现

OJ题链接:设计循环队列

class MyCircularQueue {
    private int[] arr;
    private int left;//队头
    private int right;//伪队尾,指向浪费的空间  真队尾在伪队尾的前一个
    
    public MyCircularQueue(int k) {
        arr = new int[k+1];//留一个空间 防止满的时候队尾和队头在相同位置 
        //队尾队头在相同位置时:数组为空
        //队尾 在 队头 左边一个位置时:数组已满
    }
    
    public boolean enQueue(int value) {//插入一个元素
        if (isFull()) {
            return false;
        }
        arr[right] = value;
        right = (right + 1) % arr.length;
        return true;
    }
    
    public boolean deQueue() {//删除第一个(队列 先进先出)
        if (isEmpty()) {
            return false;
        }
        left = (left + 1) % arr.length; 
        return true;
    }
    
    public int Front() {//返回队首
        if (isEmpty()) {
            return -1;
        }
        return arr[left];

    }
    
    public int Rear() {//返回队尾
        if (isEmpty()) {
            return -1;
        }
        if (right == 0) {//如果right下标为0了则再往前就是数组的最后一个元素
            return arr[arr.length-1];
        }
        return arr[(right-1) % arr.length];//因为我们浪费了一个空间来实现循环队列,所以队尾要往前走一步
    }
    
    public boolean isEmpty() {//队列是否为空
        if (left == right) {
            return true;
        }
        return false;
    }
    
    public boolean isFull() {//队列是否已满
        if ((right+1) % arr.length == left) {//看看伪队尾的下一个元素是不是队头
            return true;
        }
        return false;
    }
}

双端队列(Deque)

概念

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

方法

 双端队列的使用

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

具体的使用可以结合上面的方法来用,用法与队列(Queue)一致,在此不再赘述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Open3D实现3D激光雷达可视化:以自动驾驶的2DKITTI深度框架为例(下篇)

原创 | 文 BFT机器人 【原文链接】使用Open3D实现3D激光雷达可视化&#xff1a;以自动驾驶的2DKITTI深度框架为例&#xff08;上篇&#xff09; 05 Open3D可视化工具 多功能且高效的3D数据处理&#xff1a;Open3D是一个全面的开源库&#xff0c;为3D数据处理提供强大的解决方…

原生JavaScript实现 元素全屏与退出全屏效果

之前写过 前端screenfull实现界面全屏展示功能 突然发现自己犯傻了 其实元素js中就有全屏与取消全屏的方式 html代码如下 <!DOCTYPE html> <html> <head><title>全屏实验</title><style></style> </head> <body><d…

Python简介:一种强大的编程语言

Python是一种高级、通用的编程语言&#xff0c;以其简洁易读的语法和强大的功能而闻名。它广泛应用于各种领域&#xff0c;包括软件开发、数据分析、人工智能等。本文将详细介绍Python的特点、应用领域以及如何开始学习Python。 &#xfeff; &#xfeff;一、Python的特点 1…

【Java】spring

一、spring spring是一个很大的生态圈&#xff0c;里面有很多技术。 其中最基础的是spring framework&#xff0c;主要的技术 是springboot以及springcloud。 1、spring framework spring framework是spring生态圈中最基础的项目&#xff0c;是其他项目的基础。 1.1、核心…

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称&#xff1a;Dark High Contrast &#xff08;意思就是&#xff0c;黑色的&#xff0c;高反差的&#xff09; 步骤&#xff1a;设置→Themes→Color Theme→Dark High Contrast 效果如下&#xff1a; 感觉这个颜色的看起来比较舒服。

音箱芯片系统案例分析

近年来&#xff0c;音箱市场需求日益增长&#xff0c;其轻便、时尚的外观和无线连接的便捷性深受消费者喜爱。音箱的电路图主要由以下几个部分组成&#xff1a;音频功放芯片 前置信号处理 运算放大器 稳压电源芯片 电平指示 音频功放芯片&#xff1a;D2668,D2025,D8227,D4520…

分享一套国内功能齐全的开源MES/免费MES/MES源代码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数字大屏。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&#xff0c;计划管理…

WPS 删除设备提示:请先清空设备内的文件

一、问题描述 WPS 删除设备提示&#xff1a;请先清空设备内的文件&#xff0c;如下如&#xff1a; 二、原因方案 字面意思&#xff0c;有文件就不能删除。 应该是以设备为标识符来划分不同文件的&#xff0c;所以&#xff0c;只要右键点击【打开】就会显示文件&#xff0c;把…

力扣每日一题day37[113.路径总和ii]

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

Linux--Shell脚本应用实战

实验环境 随着业务的不断发展&#xff0c;某公司所使用的Linux服务器也越来越多。在系统管理和维护过程中&#xff0c;经 常需要编写一些实用的小脚本&#xff0c;以辅助运维工作&#xff0c;提高工作效率。 需求描述 > 编写一个名为getarp.sh的小脚本&#xff0c;记录局域…

JavaWeb笔记之JSP

一、引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注解。 代码修改麻烦&#xff1a;重新编译、部署、重启服务。 显示方式麻烦&#x…

Deployment Controller详解(上)

上一篇在《Kubectl 部署无状态应用》中介绍了如何使用 Deployment 部署五个 hello world 实例时&#xff0c;我们并没有详细探讨 Deployment Controller 的各项功能。因此&#xff0c;本文将深入介绍 Deployment Controller 的作用以及它能够完成的任务。 本文来自官方文档梳理…

Springboot是什么?Springboot详解!入门介绍

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

数据库编程大赛:一条SQL计算扑克牌24点

你是否在寻找一个平台&#xff0c;能让你展示你的SQL技能&#xff0c;与同行们一较高下&#xff1f;你是否渴望在实战中提升你的SQL水平&#xff0c;开阔你的技术视野&#xff1f;如果你对这些都感兴趣&#xff0c;那么本次由NineData主办的《数据库编程大赛》&#xff0c;将是…

pg自定义函数动态生成表名

目录 一、需求 二、踩坑记录 三、解决方案 一、需求 想在postgres数据库中动态查询【table_2023、table_2024...】这种格式表的数据。 例如&#xff1a; 今天是2023-12-22号&#xff0c;查询语句为select * from table_2023; 今天是2024-12-22号&#xff0c;查询语句为sele…

Navicat里MySQL表的创建(详细)

我以Navicat连接MySQL为例&#xff0c;演示表的创建方法。 前提 创建表的语法&#xff1a; create table 表名 &#xff08; 字段名1&#xff0c;字段类型&#xff0c; 字段名2&#xff0c;字段类型&#xff0c; ...... 字段名n&#xff0c;字段类型 ); 我计划在test库存放一…

【c】无限制输入字符

我们做题有时候会碰上这种的输入&#xff0c;一直输入字符&#xff0c; 下面附上两种解决办法 方法1&#xff1a; char s[10000]; int i0; int arr[1000]{0}; while(scanf("%c",&s[i])!EOF) { i; } 这样你就可以一直输入&#xff0…

深信服AF防火墙升级步骤(简单粗暴)

设备当前版本&#xff1a;AF8.0.75 升级升级后版本&#xff1a;AF8.0.85 官方发行&#xff1a;内容比较多&#xff0c;找设备当前版本在不在支持升级的列表即可 8.0.75是可以直接升到8.0.85的 升级前注意事项&#xff1a; 升级是需要重启设备的&#xff0c;会断网&#xff…

FreeRTOS之队列集操作(实践)

多个任务在在同一队列中传递的同一种数据类型&#xff0c;而队列集能够在任务之间传递不同的数据类型。 配置流程&#xff1a;&#xff08;更详细流程参考正点原子的教程&#xff09; 1、启用队列集将configUSE_QUEUE_SETA置1&#xff09; 2、创建队列集 3、创建队列或信号…