数据结构与算法——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.总结

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

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

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

相关文章

解决SpringMVC在JSP页面取不到ModelAndView中数据

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 问题描述 ModelAndView携带数据跳转到指定JSP页面后在该页面通过EL表达式取不到原本存放在ModelAndView中的数据。 问题原因 在IDEA中创建Maven工程时web.xml中默认的约束…

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

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

滚雪球学Java(40):解读Java面向对象编程中的方法和继承,打造可维护的代码库

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

Ajax学习笔记

目录 Ajax介绍Ajax概述同步异步 原生Ajax演示AxiosAxios的基本使用Axios快速入门Axios请求方法别名Axios案例 Ajax介绍 Ajax概述 我们前端页面中的数据应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&…

Ansible 自动化运维工具部署主从数据库+读写分离

文章目录 Ansible 自动化运维工具部署主从数据库读写分离一、主从复制和读写分离介绍二、准备工作&#xff08;1&#xff09;节点规划&#xff08;2&#xff09;修改主机名&#xff08;3&#xff09;免密&#xff08;4&#xff09;配置IP映射&#xff08;5&#xff09;安装ansi…

【二叉树】二叉树展开为链表-力扣 114 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

springcloud3 分布式事务解决方案seata之XA模式4

一 seata的模式 1.1 seata的几种模式比较 Seata基于上述架构提供了四种不同的分布式事务解决方案&#xff1a; XA模式&#xff1a;强一致性分阶段事务模式&#xff0c;牺牲了一定的可用性&#xff0c;无业务侵入 TCC模式&#xff1a;最终一致的分阶段事务模式&#xff0c;有…

Qt QWebEngineView 忽略https验证

背景 Qt版本&#xff1a;5.9.6 Qt通过WebEngineView加载网页时&#xff0c;如果遇到https且证书未认证&#xff0c;会导致页面加载失败。一般情况下内部web服务器的http是证书都是自签的&#xff0c;无法通过验证&#xff0c;但也有其他的解决方案。 重新编译 修改Qt的源码…

点云滤波--一种点云异常值检测和稳健法线估计方法

文章目录 1写在前面的话2outlier检测算法2.1获取最大集合&#xff08;Getting the maximum consistent set&#xff09;2.2异常值检测2.3估计法线和曲率 3实验结果3.1模拟数据3.2真实数据3.3 自己实测结果&#xff1a; 1写在前面的话 论文针对激光点云提出了一种基于平面拟合的…

虚拟DOM与diff算法

虚拟DOM与diff算法 snabbdom虚拟DOMdiff算法 snabbdom 是什么&#xff1a;snabbdom是著名的虚拟DOM库&#xff0c;是diff算法的鼻祖&#xff0c;Vue源码借鉴了snabbdom 虚拟DOM 是什么&#xff1a;本质上是存在内存里的 JavaScript 对象 作用&#xff1a;用来描述真实DOM的层…

科技云报道:分布式存储红海中,看天翼云HBlock如何突围?

科技云报道原创。 过去十年&#xff0c;随着技术的颠覆性创新和新应用场景的大量涌现&#xff0c;企业IT架构出现了稳态和敏态的混合化趋势。 在持续产生海量数据的同时&#xff0c;这些新应用、新场景在基础设施层也普遍基于敏态的分布式架构构建&#xff0c;从而对存储技术…

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

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

Redis之list类型

文章目录 Redis之list类型1. 列表添加/弹出元素2. 查看列表3. 获取列表中元素的个数4. 删除列表中指定的值5. 获取/指定元素的值6. 向列表中插入元素7. 删除指定索引范围之外的所有元素8. 将元素从一个列表转移到另一个列表9. 应用场景9.1 队列9.2 类似微信上订阅公众号&#x…

【C++】unordered_map与unorder_set的封装(哈希桶)

文章目录 前言一、模板参数的改造二、模板的特例化操作三、仿函数的妙用四、unordered迭代器基本操作1.const迭代器注意&#xff1a;2.HashTable与HTIterator的冲突 五、迭代器的构造问题六、完整代码1.hash_bucket.h2.unordered_set.h3.unordered_map.h 前言 我们开辟一个指针…

Docker网络问题:容器无法访问外部网络

Docker网络问题&#xff1a;容器无法访问外部网络 &#x1f61f; Docker网络问题&#xff1a;容器无法访问外部网络 &#x1f61f;摘要 &#x1f914;引言 &#x1f310;正文 &#x1f913;为什么容器无法访问外部网络&#xff1f; &#x1f615;1. 网络配置错误2. 防火墙设置3…

二分类问题的解决利器:逻辑回归算法详解(一)

文章目录 &#x1f34b;引言&#x1f34b;逻辑回归的原理&#x1f34b;逻辑回归的应用场景&#x1f34b;逻辑回归的实现 &#x1f34b;引言 逻辑回归是机器学习领域中一种重要的分类算法&#xff0c;它常用于解决二分类问题。无论是垃圾邮件过滤、疾病诊断还是客户流失预测&…

中级职称评审论文重要吗?是不是必须要论文呢?

现在评中级职称职称对论文有什么要求&#xff1f;没有论文可以参与职称评审吗&#xff1f; 建筑中级职称怎么评&#xff1f;那自然是从多方面来考核人才是否具备了评中级工程师的能力&#xff0c;职称论文就是考核的标准之一。 甘建二告诉你&#xff0c;现在评职称论文是很重…

新增MariaDB数据库管理、支持多版本MySQL数据库共存,1Panel开源面板v1.6.0发布

2023年9月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.6.0版本。 在这个版本中&#xff0c;1Panel新增MariaDB数据库管理&#xff1b;支持多版本MySQL数据库共存&#xff1b;支持定时备份系统快照和应用商店中已安装应用&#xff1b;支持为防火墙…

优维低代码实践:图片和搜索

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

字符串函数----篇章(1)

目录 补上章缺失的两道题 七.笔试题&#xff08;7&#xff09; 八.笔试题&#xff08;8&#xff09; 一.字符串函数 ( 1 )----strlen函数 二.字符串函数 ( 2 )----strcpy函数 2-1模拟实现strcpy 三.字符串函数 ( 3 )----strcmp函数 ​编辑 3-1模拟实现strcmp 四.字符串函…