当前位置: 首页 > news >正文

数据结构与算法——13.队列的拓展

这篇文章主要讲一下双端队列,优先队列,阻塞队列等队列的拓展内容。

目录

1.队列拓展概述

2.双端队列的链表实现

3.双端队列的数组实现

4.优先队列无序数组实现

5.阻塞队列

6.总结


1.队列拓展概述

首先来看一张图,来大致了解一下他们的区别。

双端队列:即两端都可以删除和添加的队列,并且满足队列FIFO的特点。

2.双端队列的链表实现

下面来看一下双端队列的链表实现:

代码如下:

/*** 基于双向环形链表实现双端队列* */
public class L15_LinkedListDeque<E> implements L15_TwoQueue<E> {/**节点类的设计*/static class Node<E>{Node<E> prev;E value;Node<E> next;/**节点的构造函数*/public Node(Node<E> prev,E value,Node<E> next){this.prev = prev;this.value = value;this.next = next;}}int capacity;//容量int size;//有效元素个数Node<E> sentinel = new Node<>(null,null,null);//创建一个节点(哨兵)/**双端队列的构造函数*/public L15_LinkedListDeque(int capacity) {//构建成环this.capacity = capacity;sentinel.next = sentinel;sentinel.prev = sentinel;}/**头部插入* 核心逻辑就是找插入节点的上一个和下一个节点* */@Overridepublic boolean offerFirst(E e) {if (isFull())return false;Node<E> a = sentinel;Node<E> b = sentinel.next;Node<E> added = new Node<>(a,e,b);a.next = added;b.prev = added;size++;return true;}@Overridepublic boolean offerLast(E e) {if (isFull())return false;Node<E> a = sentinel.prev;Node<E> b = sentinel;Node<E> added = new Node<>(a,e,b);a.next = added;b.prev = added;size++;return true;}@Overridepublic E pollFirst() {if (isEmpty())return null;Node<E> a = sentinel;Node<E> removed = sentinel.next;Node<E> b = removed.next;a.next = b;b.prev = a;size--;return removed.value;}@Overridepublic E pollLast() {if (isEmpty())return null;Node<E> removed = sentinel.prev;Node<E> a = removed.prev ;Node<E> b = sentinel;a.next = b;b.prev = a;size--;return removed.value;}@Overridepublic E peekFirst() {if (isEmpty())return null;return sentinel.next.value;}@Overridepublic E peekLast() {if (isEmpty())return null;return sentinel.prev.value;}@Overridepublic boolean isEmpty() {return size == capacity;}@Overridepublic boolean isFull() {return size == 0;}
}

3.双端队列的数组实现

下面看一下双端队列的数组实现:

下面看一下具体的代码:

/**用数组来实现双端队列*/
public class L15_ArrayDeque<E> implements L15_TwoQueue<E>{E[] array;int head;//头指针int tail;//尾指针/**构造函数,创建出数组(也就是双端队列)*/public L15_ArrayDeque(int capacity) {array = (E[]) new Object[capacity+1];}/**处理索引越界的两个方法*//**处理索引加1时的*/static int inc(int i, int length){if (i+1 >= length){return 0;}return i+1;}/**处理索引减1时的*/static int dec(int i, int length){if (i-1 < 0){return length-1;}return i-1;}@Overridepublic boolean offerFirst(E e) {if (isFull())return false;head = dec(head,array.length);array[head] = e;return true;}@Overridepublic boolean offerLast(E e) {if (isFull())return false;array[tail] = e;tail = inc(tail,array.length);return true;}@Overridepublic E pollFirst() {if (isEmpty())return null;E e = array[head];head = inc(head,array.length);return e;}@Overridepublic E pollLast() {if (isEmpty())return null;tail = dec(tail,array.length);return array[tail];}@Overridepublic E peekFirst() {return array[head];}@Overridepublic E peekLast() {return array[tail];}@Overridepublic boolean isEmpty() {return head == tail;}@Overridepublic boolean isFull() {if (tail>head)return tail-head == array.length-1;if (tail<head)return head-tail == 1;if (tail == head)return false;return true;}
}

用数组实现双端队列不是太清楚,主要还是用链表来实现吧。

4.优先队列无序数组实现

优先队列,就是队列中的元素具有不同优先级的一种队列。入队的操作和普通队列一样,但是出队时是优先级高的元素先出队。

下面我们来看一下优先队列的具体实现:

下面看一下具体的代码:

/*** 用无序数组来实现优先队列* */
public class L16_PriorityQueue<E extends L16_Priority> implements L8_QueueInter<E>{L16_Priority[] array;int size;public L16_PriorityQueue(int capacity) {array = new L16_Priority[capacity];}@Overridepublic boolean offer(E value) {if(isFull())return false;array[size] = value;size++;return true;}/**返回优先级最高的索引*/private int selectMax(){int max = 0;for (int i = 0; i < size; i++) {if (array[i].priority() > array[max].priority())max = i;}return max;}@Overridepublic E poll() {if (isEmpty())return null;int max = selectMax();E e = (E)array[max];remove(max);return e;}private void remove(int index){if (index < size-1){System.arraycopy(array,index+1,array,index,size-1-index);}size--;}@Overridepublic E peek() {if (isEmpty())return null;int max = selectMax();return (E)array[max];}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic boolean isFull() {return size == array.length;}
}

不算难,理清思路很简单的。

优先队列基于有序数组的实现和这个类似,并且比这个更简单,就是在入队操作时要找准位置而已。

5.阻塞队列

阻塞队列涉及的其他方面的内容,当我那部分的内容更新完毕后,再回来更新这个阻塞队列的实现。

6.总结

总的来说,队列不难,关键就是抓住链表和数组的特点,掌握链表和数组的相关操作就行

相关文章:

数据结构与算法——13.队列的拓展

这篇文章主要讲一下双端队列&#xff0c;优先队列&#xff0c;阻塞队列等队列的拓展内容。 目录 1.队列拓展概述 2.双端队列的链表实现 3.双端队列的数组实现 4.优先队列无序数组实现 5.阻塞队列 6.总结 1.队列拓展概述 首先来看一张图&#xff0c;来大致了解一下他们的…...

机器学习入门教学——损失函数(交叉熵法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…...

pytest一些常见的插件

Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址&#xff1a;http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…...

基于51单片机多路DTH11温湿度检测控制系统

一、系统方案 1、本设计采用51单片机作为主控器。 2、DHT11采集温度度&#xff0c;支持3路温度度&#xff0c;液晶1602显示。 3、按键设置报警阀值。 4、系统声光报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********…...

宝塔重装注意事项

欢迎关注我的公众号&#xff1a;夜说猫&#xff0c;让一个贫穷的程序员不靠打代码也能吃饭~ 前言 宝塔8.0版本&#xff0c;宝塔卸载重装&#xff0c;或者重装Linux系统后重新安装宝塔也适用。 不能上来直接就执行安装宝塔脚本&#xff0c;除非之前没有安装过宝塔。 步骤 1、…...

【MySQL】 MySQL的增删改查(进阶)--壹

文章目录 &#x1f6eb;数据库约束&#x1f334;约束类型&#x1f38b;NOT NULL约束&#x1f38d;UNIQUE&#xff1a;唯一约束&#x1f333;DEFAULT&#xff1a;默认值约束&#x1f384;PRIMARY KEY&#xff1a;主键约束&#x1f340;FOREIGN KEY&#xff1a;外键约束&#x1f…...

Map<K,V>的使用和List学习

Map Map是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。对于静态类型的查找来说&#xff0c;一般直接遍历或者用二分查找【不会对区间进行插入和删除操作】 而在现实生活中的查找比如&#xff1a; 根据姓名查询考试成绩通讯录…...

Flask实现Web服务调用Python程序

Flask实现Web服务调用Python程序_flask调用python程序_小白白程序员的博客-CSDN博客 【小沐学Python】Python实现Web服务器&#xff08;Flask入门&#xff09;_python flask web开发_爱看书的小沐的博客-CSDN博客...

步步为营,如何将GOlang引用库的安全漏洞修干净

文章目录 引场景构建第一步、直接引用的第三方库升级修复策略1.确认是否为直接引用的第三方库2.找到需要升级的版本是否为release版本 第二步、间接引用的第三方库升级修复策略那么问题来了&#xff0c;我们这么间接引用库的对应的直接引用库是哪个呢&#xff1f; &#xff08;…...

as-if-serial与happens-before原则详解

文章目录 前言详解解决多线程下的问题 Happens-before原则总结as-if-serial语义happens-before的例子 前言 "as-if-serial"原则是Java内存模型中的一个重要概念。该规则规定&#xff1a;不管怎么重排序&#xff08;编译期间的重排序&#xff0c;指令级并行的重排序&…...

基于Yolov8的工业小目标缺陷检测(2):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.工业油污数据集介绍 1.1 小目标定义 1.2 难点 1.3 工业缺陷检测算法介绍 1.3.1 YOLOv8...

ARM64汇编基础

ARM64汇编基础 主要内容 到目前为止&#xff0c;大部分的移动设备都是64位的arm架构&#xff0c;一直想抽个时间系统学习下&#xff0c;这个周末就专门来学习下。毕竟两天的时间&#xff0c;也只是简单的入门了解下&#xff0c;为后续工作和学习打下基础。 本次学习的主要内容…...

Nodejs 第十六章(ffmpeg)

FFmpeg 是一个开源的跨平台多媒体处理工具&#xff0c;可以用于处理音频、视频和多媒体流。它提供了一组强大的命令行工具和库&#xff0c;可以进行视频转码、视频剪辑、音频提取、音视频合并、流媒体传输等操作。 FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;…...

k8s集群部署es

集群内创建需要用到存储&#xff0c;此处举例使用腾讯云cfs共享存储 内存limits限制不需要加&#xff0c;否则会经常内存溢出导致es集群故障 apiVersion: apps/v1 kind: StatefulSet metadata:name: es7-clusternamespace: elasticsearch spec:serviceName: es-clusterreplica…...

学习记忆——宫殿篇——记忆宫殿——记忆桩——火车+外院+客厅+卧室

护板 警示灯 烟筒 采集箱 司炉室 桥 电线杆 棚顶 车厢 护栏 植物 石阶 水泥台 竹门 树干 躺椅 柱子 墙 池 洞 方灯 枕头 树 浴池 墙 射灯 藤条 浴巾框 耳环 窗户 灯 沙发 壁炉 吊灯 兵马俑 门 石佛 沙发椅 圆木 弧形木箱盖 床 窗帘 画板 纸伞 花 沙发背 颜料 抽屉...

QT用户登录注册,数据库实现

登录窗口头文件 #ifndef LOGINUI_H #define LOGINUI_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QMessageBox>#include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> …...

GEE学习总结(9)——像元二分法计算月度植被覆盖度(MODIS)

像元二分法计算植被覆盖度 通过MODIS的NDVI数据集MOD13Q1和像元二分法计算植被覆盖度 var multi_NDVI ee.ImageCollection(MODIS/006/MOD13Q1).filterDate(2015-06-01, 2016-09-01).select(NDVI).max().divide(10000).clip(geometry);var ndviVis {min: 0.0,max: 1,palette…...

RabbitMQ用户命令_策略_日志

RabbitMQ相关安装 Centos离线安装RabbitMQ并开启MQTT Docker安装rabbitMQ RabbitMQ集群搭建和测试总结_亲测 Docker安装RabbitMQ集群_亲测成功 RabbitMQ创建管理员命令 #查看当前用户命令&#xff1a; rabbitmqctl list_users#创建用户和密码 rabbitmqctl add_user admin…...

停车场系统、智慧城市停车、智慧社区、物业管理、新能源充电、人脸门禁 uniapp 系统源码

1. 智慧停车 支持模式 封闭性单个停车场路边停车(车位级管理)大小场(场中场)&#xff0c;多场子并行或嵌套 所有者模式 统一平台管理总平台下子账号(区域代理)自建场地资源&#xff0c;自行维护数据总平台下子账号(区域代理)再分配和单个停车场管理人员(物业管理/维保/保安/财务…...

Linux磁盘管理

物理设备的命名规则 在linux系统中一切都是文件&#xff0c;硬件设备也不例外。即然是文件&#xff0c;就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来&#xff0c;目的是让用户通过设备文件的名字可以看出设备大致的属性以及分区信息等&#xff1b;在…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…...