数据结构 之 队列(Queue)

​​​​​​​

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨

🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖

🎉希望我们在一篇篇的文章中能够共同进步!!!

🌈个人主页:AUGENSTERN_dc

🔥个人专栏:C语言 | Java | 数据结构

⭐个人格言:

一重山有一重山的错落,我有我的平仄

一笔锋有一笔锋的着墨,我有我的舍得

目录

1. 定义:

2. 队列的常用方法和模拟实现:

2.1 常用方法:

2.2 模拟实现:

 3. 队列的模拟实现源码:

4. 循环队列

4.1 模拟实现:

5. 双端队列:


1. 定义:

队列和栈类似,是一种只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表;

进入队列的一端称为队尾,离开队列的一端称为队头

队列这个结构遵循先进先出的原则;

 在日常生活中,例如:

多人在网上对老师提交任务时,会将我们所提交的任务存放到一个队列中,然后队列将这些任务按照先进先出的顺序进行出队和入队的操作,老师看到的任务,也就会按照提交时间的先后来排序;
 

由上图可以看出Queue是一个接口,底层是由链表(LinkedList)实现的;

2. 队列的常用方法和模拟实现:

2.1 常用方法:

方法作用
offer(E e)将e进行入队操作
E poll()

将e进行出队列操作,并且返回e的值

E peek()获取队头元素
int size()获取队列的长度
boolean isEmpty()判断队列是否为空

(在队列的模拟实现中,我们并不使用泛型,而是使用整形来代替泛型) 

以上就是队列的常用方法,接下来我们进行模拟实现:

2.2 模拟实现:

队列的底层是由链表来实现的,我们先创建一个My_Queue类:

public class My_Queue {public static class ListNode {ListNode next;      //节点的后继ListNode prev;      //节点的前驱int value;          //节点的值public ListNode() {//不带参数的构造方法}public ListNode(int value){//带一个参数的构造方法,将节点的值赋为valuethis.value = value;}}ListNode first;         //队头节点ListNode last;          //队尾节点int size = 0;           //队列长度
}

< 1 > offer方法:

offer方法是将指定元素插入到队列的队尾:

与之前的栈和顺序表不同,由于队列的底层是用链表实现的,故不需要判断队列是否满了;

// 入队列---向双向链表位置插入新节点public void offer(int e){ListNode newNode = new ListNode(e);     //实例化一个节点if(first == null){                      //若该队列为空first = newNode;                    //将队头和队尾都更新为newNodelast = newNode;}else{                                  //若队列不为空last.next = newNode;                //将newNode赋值给队尾.nextnewNode.prev = last;                //将newNode的pre赋值为队尾last = newNode;                     //将队尾更新为newNode}last = newNode;                         //更新队尾size++;                                 //队列长度 +1
}

< 2 > poll方法:

poll方法是将队头的元素进行出队操作,并返回队头元素的值:

在进行该操作之前,我们需要判断队列是否为空,若为空,则需抛出异常:

异常代码如下:

public class QueueEmptyException extends RuntimeException {public QueueEmptyException () {super();}public QueueEmptyException (String str) {super(str);}
}

poll方法如下:

public int poll(){// 1. 队列为空// 2. 队列中只有一个元素----链表中只有一个节点---直接删除// 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除int value = 0;if(first == null){      //若为空,则抛出异常throw new QueueEmptyException("队列为空,不能进行poll操作!!!");}else if(first == last){        //若只有一个节点,则直接删除该节点last = null;first = null;}else{value = first.value;        //将队头的元素赋值给valuefirst = first.next;         //将队头更新为队头的下一个节点first.prev.next = null;first.prev = null;}size--;                         //将队列长度 -1return value;                   //返回队头的值
}

< 3 > peek方法:

peek方法是返回队头的节点的值:

// 获取队头元素---获取链表中第一个节点的值域public int peek(){if(first == null){      //若队列为空,则抛出异常throw new QueueEmptyException("队列为空,不能进行peek操作!!!");}return first.value;     //返回队头的值
}

< 4 > size方法:

size方法是返回队列的长度:

public int size() {return size;        //返回队列的长度
}

< 5 > isEmpty方法:

isEmpty是判断队列是否为空:

public boolean isEmpty(){return first == null;       //返回队头是否为空 的值
}

 3. 队列的模拟实现源码:

public class My_Queue {public static class ListNode {ListNode next;      //节点的后继ListNode prev;      //节点的前驱int value;          //节点的值public ListNode() {//不带参数的构造方法}public ListNode(int value){//带一个参数的构造方法,将节点的值赋为valuethis.value = value;}}ListNode first;         //队头节点ListNode last;          //队尾节点int size = 0;           //队列长度// 入队列---向双向链表位置插入新节点public void offer(int e){ListNode newNode = new ListNode(e);     //实例化一个节点if(first == null){                      //若该队列为空first = newNode;                    //将队头和队尾都更新为newNodelast = newNode;}else{                                  //若队列不为空last.next = newNode;                //将newNode赋值给队尾.nextnewNode.prev = last;                //将newNode的pre赋值为队尾last = newNode;                     //将队尾更新为newNode}last = newNode;                         //更新队尾size++;                                 //队列长度 +1}// 出队列---将双向链表第一个节点删除掉public int poll(){// 1. 队列为空// 2. 队列中只有一个元素----链表中只有一个节点---直接删除// 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除int value = 0;if(first == null){      //若为空,则抛出异常throw new QueueEmptyException("队列为空,不能进行poll操作!!!");}else if(first == last){        //若只有一个节点,则直接删除该节点last = null;first = null;}else{value = first.value;        //将队头的元素赋值给valuefirst = first.next;         //将队头更新为队头的下一个节点first.prev.next = null;first.prev = null;}size--;                         //将队列长度 -1return value;                   //返回队头的值}// 获取队头元素---获取链表中第一个节点的值域public int peek(){if(first == null){      //若队列为空,则抛出异常throw new QueueEmptyException("队列为空,不能进行peek操作!!!");}return first.value;     //返回队头的值}public int size() {return size;        //返回队列的长度}public boolean isEmpty(){return first == null;       //返回队头是否为空 的值}
}

4. 循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。 环形队列通常使用数组实现。

4.1 模拟实现:

/*解题思路:1. 注意,循环队列底层空间大小是固定的2. 采用计数方式实现队列空或者满的判断3. 入队列时:队列可能满,往队尾插入,注意back在末尾特殊情况4. 出队列时:队列可能空,删除队头元素,注意front可能在队尾5. 获取队头注意空队列时返回-16. 获取队尾时,注意back-1可能为负数,队尾元素下标:(back-1+array.length)%array.length
*/
class MyCircularQueue {int[] array;int front;   // 队头int back;    // 队尾int count;   // 队列中有效元素个数public MyCircularQueue(int k) {array = new int[k];}public boolean enQueue(int value) {if(isFull()){return false;}// 在队尾插入一个元素,然后back往后移动array[back] = value;back++;// back往后移动之后,可能会来到空间末尾// 此时将back挪到空间起始位置if(back == array.length){back = 0;}count++;return true;}public boolean deQueue() {if(isEmpty()){return false;}// 出队列,队头往后移动++front;// 队头往后移动之后也可能会来到空间末尾// 此时需要挪到空间起始位置front %= array.length;--count;return true;}public int Front() {if(isEmpty()){return -1;}// 如果队列不空,说明队列中有元素,队头元素直接返回front即可return array[front];}public int Rear() {if(isEmpty()){return -1;}// 如果队列不空,说明队列中有元素// 队尾元素即:back-1,// 如果back不在0号位置,back-1就是队尾元素下标// 如果back在0号位置,-1之后就是负数,因此需要+数组长度// 两个结合起来:return array[(back - 1 + array.length)%array.length];}public boolean isEmpty() {return 0 == count;}public boolean isFull() {return count == array.length;}
}

5. 双端队列:

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

Deque是一个接口,使用时必须创建LinkedList的对象。

以上就是队列的全部内容:感谢观看!!!!

制作不易,三连支持

谢谢!!!

以上的模拟实现代码未必是最优解,仅代表本人的思路,望多多理解,谢谢!!

最后送给大家一句话,同时也是对我自己的勉励:

知不足而奋进,望远山而前行!!!!

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

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

相关文章

JAVA爬虫系列

目录 准备工作 yml 1.入门程序&#xff08;获取到静态页面&#xff09; 2.HttpClient---Get 2.1 修改成连接池 3.HttpClient---Get带参数 3.1 修改成连接池 4.HttpClient---Post 4.1 修改成连接池 5.HttpClient---Post带参数 6.HttpClient-连接池 7.设置请求信息 …

蓝桥真题——-小蓝重组质数(全排列和质数判断)

小蓝有一个十进制正整数n&#xff0c;其不包含数码0&#xff0c;现在小蓝可以任意打乱数码的顺序&#xff0c;小蓝想知道通过打乱数码顺序,n 可以变成多少个不同的质数。 #include <iostream> #include<bits/stdc.h> using namespace std; bool isprime(int n) {if…

讯鹏Andon系统解决方案帮助工厂打造生产过程透明化

在现代制造业中&#xff0c;高效透明的生产管理模式对企业的发展至关重要。Andon系统作为一种解决方案&#xff0c;通过软硬件结合的方式&#xff0c;为企业打造了高效透明的生产管理模式&#xff0c;帮助企业实现生产过程的优化和管理的可视化。 Andon系统的软硬件结合为企业提…

swiftUI中的可变属性和封装

swiftUI的可变属性 关于swift中的属性&#xff0c;声明常量使用let &#xff0c; 声明变量使用var 如果需要在swiftUI中更改视图变化那么就需要在 var前面加上state 。 通过挂载到state列表 &#xff0c;从而让xcode找到对应的改变的值 例子&#xff1a; import SwiftUIstruc…

【兆易创新GD32H759I-EVAL开发板】图像处理加速器(IPA)的应用

GD32H7系列的IPA&#xff08;Image Pixel Accelerator&#xff09;是一个高效的图像处理硬件加速器&#xff0c;专门设计用于加速图像处理操作&#xff0c;如像素格式转换、图像旋转、缩放等。它的优势在于能够利用硬件加速来实现这些操作&#xff0c;相比于软件实现&#xff0…

BLE---Service interoperability requirements

0 Preface/Foreword references: Bluetooth core specification V5.4 definition&#xff1a;定义 declaration&#xff1a;声明 1 service definition&#xff08;服务定义&#xff09; 服务定义&#xff08;definition&#xff09;&#xff1a;必须包含服务声明(declara…

【JavaScript】JavaScript 运算符 ① ( 运算符分类 | 算术运算符 | 浮点数 的 算术运算 精度问题 )

文章目录 一、JavaScript 运算符1、运算符分类2、算术运算符3、浮点数 的 算术运算 精度问题 一、JavaScript 运算符 1、运算符分类 在 JavaScript 中 , 运算符 又称为 " 操作符 " , 可以实现 赋值 , 比较 > < , 算术运算 -*/ 等功能 , 运算符功能主要分为以下…

MATLAB中visdiff函数用法

目录 语法 说明 示例 比较两个文件 比较两个文件并指定类型 发布比较报告 visdiff函数的功能是比较两个文件或文件夹。 语法 visdiff(filename1,filename2) visdiff(filename1,filename2,type) comparison visdiff(___) 说明 visdiff(filename1,filename2) 打开比较工…

海格里斯HEGERLS托盘搬运机器人四向车引领三维空间集群设备柔性运维

随着市场的不断迅猛发展变化&#xff0c;在物流仓储中&#xff0c;无论是国内还是海外&#xff0c;都对托盘式解决方案需求量很大。顾名思义&#xff0c;托盘式解决方案简单理解就是将产品放置在托盘上进行存储、搬运和拣选。 面对托盘式方案需求&#xff0c;行业中常见的方案是…

面试常问,ADC,PWM

一 PWM介绍 pwm全名&#xff08;Pulse Width Modulation&#xff09;&#xff1a;脉冲宽度调制 在具有惯性的系统中&#xff0c;可以通过对一系列脉冲的宽度进行调制&#xff0c;来等效地获得所需要的模拟参量&#xff0c;常应用于电机控速等领域。PWM一定程度上是数字到模拟…

Java使用Selenium实现自动化测试以及全功能爬虫

前言 工作中需要抓取一下某音频网站的音频&#xff0c;我就用了两个小时学习弄了一下&#xff0c;竟然弄出来&#xff0c;这里分享记录一下。 springboot项目 Selenium Java使用Selenium实现自动化测试以及全功能爬虫 前言1 自动化测试2 java中集成Selenium3 添加浏览器驱动4…

【linux】进程(一)

先看预备知识&#xff0c;对本篇文章更有帮助。 目录 进程概念&#xff1a;了解动态运行的概念&#xff1a;进程的本身内部属性&#xff1a;启动进程&#xff1a;关闭进程&#xff1a; 如何创建进程&#xff1a;进程状态&#xff1a;直接看进程状态&#xff1a;僵尸进程与孤儿…

llamma笔记:部署Llama2

1 申请Llama2 许可 Download Llama (meta.com) 地址似乎不能填中国 1.1 获取url 提交申请后&#xff0c;填的那个邮箱会受到一封meta发来的邮件&#xff0c;打码部分的url&#xff0c;之后会用得上 2 ubuntu/linux 端部署Llama2 2.1 git clone Llama2的github 仓库 bash g…

git基础命令(四)之分支命令

目录 基础概念git branch-r-a-v-vv-avv重命名分支删除分支git branch -h git checkout创建新的分支追踪远程分支同时切换到该分支创建新的分支并切换到该分支撤销对文件的修改&#xff0c;恢复到最近的提交状态&#xff1a;丢弃本地所有修改git checkout -h git merge合并指定分…

ASP.NET Mvc+FFmpeg+Video实现视频转码

目录 首先&#xff0c;做了视频上传的页面&#xff1a; FFmpeg&#xff1a;视频转码 FFmpegHelper工作类&#xff1a; 后台控制器代码&#xff1a; 前端视图代码&#xff1a; 参考文章&#xff1a; 首先&#xff0c;做了视频上传的页面&#xff1a; 借鉴了这篇文章 ASP.…

D. Tandem Repeats?

思路&#xff1a;首先我们要枚举长度&#xff0c;然后从前往后遍历&#xff0c;判断是否存在改长度的重复串。 代码&#xff1a; void solve(){string s;cin >> s;int n s.size();int ans 0;for(int len n / 2;len > 1;len --){int t 0;for(int i 0;i len <…

TSINGSEE青犀AI智能分析网关V4酿酒厂安全挂网AI检测算法

在酿酒行业中&#xff0c;安全生产一直是企业经营中至关重要的一环。为了确保酒厂生产过程中的安全&#xff0c;TSINGSEE青犀AI智能分析网关V4的安全挂网AI检测算法发挥了重要作用。 TSINGSEE青犀AI智能分析网关V4的安全挂网检测算法是针对酒厂里酒窖挂网行为进行智能检测与识…

个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置

今天的更新内容主要是了解为什么选择这个网站搭建方案&#xff0c;以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案&#xff0c;看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith&#xff08;网站技术分析工具&#xff09;上我们可以…

【矩阵】73. 矩阵置零【中等】

矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 解题思路 1、…

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第八篇&#xff0c;即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后&#xff0c;我…