【数据结构】队列-Queue

news2024/11/19 5:25:46

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:浅谈数据结构
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

队列

  • 1.什么是队列
  • 2. 队列的使用
  • 3. 队列的模拟实现
  • 4. 循环队列
  • 5. 双端队列(Deque)

在这里插入图片描述

1.什么是队列

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

在这里插入图片描述

2. 队列的使用

在Java中,Queue是个接口,底层是通过链表实现的:
在这里插入图片描述

方法功能
boolean offer(E e)入队列
E poll()出队列
peek()获取队头元素
int size()获取队列中有效元素个数
boolean isEmpty()检测队列是否为空

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

上述方法的实现:

import java.util.LinkedList;
import java.util.Queue;
public class Main {
    //方法的实现
    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());
        }
    }
}

3. 队列的模拟实现

我们知道队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过线性表可以了解到常见的空间类型有两种:顺序结构链式结构

在这里插入图片描述
模拟实现队列:

public class MyQueue {
    //双向链表节点
    static class ListNode {
        public int val;
        public ListNode next;
        public ListNode prev;

        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;//队头
    public ListNode last;//队尾
    public int usedSize;//队列元素个数

    // 入队列---向双向链表位置插入新节点
    public boolean offer(int val) {
        ListNode node = new ListNode(val);
        if(head == null) {
            head = node;
            last = node;
        }else {
            last.next = node;
            node.prev = last;
            last = last.next;
        }
        usedSize++;
        return true;
    }

    // 出队列---将双向链表第一个节点删除掉
    // 1. 队列为空
    // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
    // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
    public int poll() {
        if(head == null) {
            return -1;
        }
        int retVal = head.val;
        if(head.next == null) {
            head = null;
            last = null;
            return retVal;
        }
        head = head.next;
        head.prev = null;//第一个节点删除
        usedSize--;
        return retVal;
    }

    // 获取队头元素---获取链表中第一个节点的值域
    public int peek() {
        if(head == null) {
            return -1;
        }
        return head.val;
    }

    public boolean empty() {
        return head == null;
    }

    public int size() {
        return usedSize;

4. 循环队列

循环队列顾名思义就是首位相连的队列,自然界中的生产者消费者分解者模型可以使用循环队列来描述。而环形队列通常使用数组实现。
在这里插入图片描述
数组下标循环的小技巧

  1. 下标最后再往后(offset 小于 array.length): index = (index + offset) % array.length
    在这里插入图片描述
  2. 下标最前再往前(offset 小于 array.length): index = (index + array.length - offset) %array.length
    在这里插入图片描述

如何区分空与满?

  1. 通过添加 size 属性记录
  2. 保留一个位置
  3. 使用标记
    在这里插入图片描述

循环队列的实现:

class MyCircularQueue {
    public int[] elem;
    public int front;//队头
    public int rear;//队尾
    
    public MyCircularQueue(int k) {
        elem = new int[k+1];
    }

    //队尾入队
    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;
        }
        front = (front+1) % elem.length;
        return true;
    }
    //得到队头元素
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return elem[front];
    }
    //得到队尾元素
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;
        return elem[index];
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return (rear+1)%elem.length == front;
    }
}

5. 双端队列(Deque)

**双端队列(deque)**是指允许两端都可以进行入队和出队操作的队列。在这里插入图片描述
Deque是一个接口,使用时必须创建LinkedList的对象:

在这里插入图片描述
在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口:

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

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

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

相关文章

报名倒计时 | 超硬核!第四届中国云计算基础架构开发者大会邀你参会

编者按&#xff1a;第四届 CID 大会将于 10 月 21 日在深圳南山科技园希尔顿花园酒店举办&#xff01;龙蜥社区作为本次 CID 大会支持的单位&#xff0c;诚邀您参与此次大会。 本大会将聚焦业界最前沿的云计算基础架构技术成果&#xff0c;围绕基础架构技术领域的技术交流&…

访问文件夹

访问文件夹并读取文件内容 将展示如何使用 JavaScript 中的 showDirectoryPicker() 方法来访问文件夹&#xff0c;并读取文件的内容。 HTML 结构 首先&#xff0c;需要一个按钮来触发打开文件夹的操作&#xff1a; <button>打开文件夹</button>还需要一个段落元…

限频差分探头N2060Apro

N2060Apro 差分探头提供一个安全的仪器给所有的示波器使用&#xff0c;它可以转换由高输入的差动电压进入一个低电压(≤7V)&#xff0c;并且显示波形在示波器上&#xff0c;使用频宽高达 200MHz&#xff0c;非常适合大电力测试、研发、维修使用。差分探头输出标示是设计在操作示…

系统大前端学习路线

第一阶段&#xff1a;HTML/CSS3以及工具部分 HTML和CSS用来制作网页&#xff0c;利用盒子模型&#xff0c;浮动&#xff0c;定位&#xff0c;flex布局进行网页布局&#xff0c;网页颜色&#xff0c;字体&#xff0c;背景&#xff0c;变换&#xff0c;过渡&#xff0c;动画等增…

flutter 创建插件

资料&#xff1a; flutter与原生通信的方式简介 - 简书 完整流程 Flutter 集成 Golang 多语言跨端开发基础案例 - 知乎 https://www.cnblogs.com/webabcd/p/flutter_lib_plugin_plugin_ios.html 步骤1、创建插件 我创建的插件名字是konnect_im_sdk 选择的语言是 java和swi…

怎么多号发圈和批量加好友?

你知道怎么多号发圈和批量加好友吗&#xff1f; 我们都知道&#xff0c;微信号多&#xff0c;管理起来是一件相当麻烦的事。 那发圈和加好友&#xff0c;多号的话&#xff0c;那是相当大的工作量&#xff0c;那有没有什么办法可以多号同时进行发圈和加人吗&#xff1f; 当然有的…

【Java实战】Mybatis plus根据数据库表自动生成代码

首先生成一个maven项目&#xff0c;不会生成的参考 【Java实战】创建第一个Springboot项目Hello worldhttps://blog.csdn.net/forgetmiss/article/details/133889733 &#xff08;写的过程中遇到过的问题&#xff1a;mybatis-plus 生成controller中的代码&#xff0c; Reques…

Bootstrap-- 内容

Bootstrap4 - 中文文档 - 内容 处理不同尺寸下的图片的处理&#xff0c;避免资源浪费&#xff01;&#xff01;&#xff01;

liunx下软链接和硬链接的用法

什么是软链接&#xff08;类似快捷方式&#xff09;&#xff1a; 符号连接&#xff08;Symbolic Link&#xff09;&#xff0c;也叫软连接。 软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中&#xff0c;文件实际上是一个文本文件&#xff0c…

怎么压缩证件照到200k以下?教你在线压缩图片指定kb

新一年的国考报名开始了&#xff0c;相信许多小伙伴还在发愁报名信息资料上传的问题&#xff0c;比如提交证件照时会要求具体的图片kb大小&#xff0c;本文就来教大家怎么快速图片压缩指定大小&#xff08;https://www.yasuotu.com/imagesize&#xff09;&#xff0c;而且还不需…

GitKraken for Mac:强大且跨平台的Git客户端

如果你正在寻找一个强大、直观且跨平台的Git客户端&#xff0c;那么GitKraken绝对值得你考虑。在本文中&#xff0c;我们将详细介绍GitKraken的各项功能和优势&#xff0c;以帮助你了解它如何帮助你更有效地管理和提交代码。 GitKraken是一款真正的跨平台工具&#xff0c;可以在…

2024年关于湖北省建筑安全员B证报考你需要了解

2024年关于湖北省建筑安全员B证报考你需要了解 建筑安全员B证指的是建设厅三类人员建安B证&#xff0c;很多人对于B证报考不是很了解&#xff0c;对于安全员B报考条件、报考流程、报考时间、报考地区等事项叙后尘告诉你们。 湖北建筑安全员B证报考条件-建安B证 1.你的二级建造师…

(2022|ECCV,文本图像视频,3D 邻域注意,3D 稀疏注意)NÜWA:神经视觉世界创建的视觉合成预训练

NWA: Visual Synthesis Pre-training for Neural visUalWorld creAtion 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 2.1. 视觉自回归模型 2.2. 视觉…

HugeGraph1.0.0部署,吐槽一下Hubble的数据导入 Bug

背景 HugeGraph 安装部署了最新版本1.0.0&#xff0c;发现它的 Web 工具 Hubble 有一个大 Bug。数据导入的时候&#xff0c;配置节点属性映射这个选项时&#xff0c;下拉框只有一个选项&#xff0c;但实际上&#xff0c;元数据配置中的属性有3个&#xff0c;这个 Bug 是怎么产…

Python开发之二维数组空缺值的近邻填充

Python开发之二维数组空缺值的填充 1 实现一&#xff0c;任意位置填充2 实现二&#xff0c;填充内部3 实现三&#xff0c;只填充边缘&#xff0c;不包括四个角 前言&#xff1a;主要实现二维数据里面某一个数据的缺失&#xff0c;用缺失的近邻数据进行均值填充&#xff0c;可以…

oracle 错题汇总

在Oracle数据库中&#xff0c;如果你在GROUP BY子句中指定了列&#xff0c;那么SELECT子句中除了聚合函数外的每个列都必须在GROUP BY子句中列出。 1.查询出每个部门的编号、名称、位置、部门人数、平均工资。 SELECT d.deptno AS "部门编号", d.dname AS &…

Jmeter(四):请求默认值元件应用,正则表达式提取器元件讲解

Jmeter请求默认值元件应用 HTTP请求默认值 在公司内部进行测试的时候&#xff0c;一般测试环境访问的接口地址&#xff08;服务器名称 或IP&#xff09;、端口、协议一般都是不变的&#xff0c;但http请求取样器每个请求都要求写一遍 这些信息&#xff0c;在实际HTTP请求取样…

数据驱动娱乐的未来:揭秘爱奇艺如何利用Apache Spark实现个性化推荐和内容分析

Apache Spark 在爱奇艺的现状与应用 Apache Spark 是爱奇艺大数据平台的核心组件&#xff0c;被广泛应用于数据处理、数据同步和数据查询分析等关键场景。在数据处理方面&#xff0c;爱奇艺通过数据开发平台支持开发者提交 Spark Jar 包任务或 Spark SQL 任务&#xff0c;进行…

预防电压波动带来的灾难:瞬态电压抑制器的作用和原理 | 百能云芯

在当今数字化时代&#xff0c;电子设备的应用已经无处不在&#xff0c;从个人电脑到智能手机&#xff0c;再到工业自动化系统和通信设备&#xff0c;这些设备的正常运行对于我们的生活和工作至关重要。然而&#xff0c;电子设备常常会受到来自电力系统的电压波动和瞬态电压的威…

Win+L不能锁屏

1、运行WINR&#xff0c;输入REGEDIT&#xff0c;运行注册表&#xff1a; 2、CTRLF&#xff0c;输入查找DisableLockWorkstation 3、双击这个&#xff0c;点十进制&#xff0c;输入0点确认即可。