数据结构--队列

news2024/12/24 10:19:24

文章目录

  • 队列基础
  • 队列的实现
    • 链表实现
    • 环形数组实现
      • tail一直加的问题
      • 容量处理
  • 队列的使用

队列基础

queue 是以顺序的方式维护的一组数据集合
相对于链表来说,队列操作数据的位置是固定的只能2端操作。
在一端添加数据,从另一端移除数据。习惯来说,添加的一端称为,移除的一端称为,就如同生活中的排队买商品、等等排队的情况。
先进先出

队列的实现

队列的实现方式有很多种

链表实现

在这里插入图片描述

在java中linkedlist可以直接当作队列来使用
在这里插入图片描述
LinkedList实现了Deque接口也就是双端队列接口。
在这里插入图片描述
那么链表如何实现队列呢。

维护一个头尾指针
在这里插入图片描述
然后其他的就是linked插入和删除了。没啥好讲的了。

环形数组实现

如果是普通数组实现,添加比较快,但是删除,则需要后面元素全部向前移动会非常的慢。
但是环形数组就没有这样的问题了。

java实现类
ArrayBlockingQueue 有界阻塞队列
此类支持一个可选的公平策略,用于对等待的生产者和消费者线程进行排序
ArrayDeque可调整大小的数组实现
所有这些操作都在线性时间内运行。

环形数组,起点和终点是自由的。

下标计算
如数组长度4,起点3,第二个元素的下标为 ( 3 + 2 ) % 4 = 1 (3+2)\%4=1 (3+2)%4=1
在这里插入图片描述
为空判断
头指针等于尾指针
在这里插入图片描述

为满判断

  1. (尾指针+1)%len=头指针
  2. 尾指针-头指针=len,这个时候头尾指针+1的时候不在取模,一直向上加
  3. 计数元素个数

tail一直加的问题

tail一直向上加会有超出int/10范围的可能,会导致计算错误。
如:tail超出 2 31 − 1 2^{31}-1 2311就会导致计算时tail为负数。取模运算错误。找不到索引
而且这样取模的运算性能也不高。

解决方案:

  • 容量设置为 2 n 2^n 2n
  • 计算取模的时候用按位与一个 2 n − 1 2^n-1 2n1

如:计算最后的一个元素的索引

index = tail & capacity - 1

原理:
取模就是把多余的去掉。
如果按位与—那么如:
一个数与00001111按位取与
那么高的位数全部会为0,保留最后4位。

容量处理

所以我们在设置容量的时候需要讲容量转换为 2 n 2^n 2n
首先需要检查是否为 2 n 2^n 2n
检测

//返回是否满足 2^n
return (capacity & capacity - 1) == 0 

如果不满足我们可以抛出异常或者将起转换为距离比他大的其最小的 2 n 2^n 2n

  1. log处理
n = Math.log10(n-1)/Math.log10(2) + 1
  1. 位运算
    我们知道找到这样一个数就是可以将其后面数字全部为1后加1.
    假设要求数c有n位二进制数
    让这个数减一后 c -= 1
    或一个数右移一位 c |= c >>1
这样从左到右第二位数就一定是1了
这样我们就有第一二位都为1了

或一个c右移2为 c|= c>>2

这样1-4位都为1了

依次类推
最后到>>16位就可以将int全部满足了
最后+1就可以了

队列的使用

BFS广度遍历

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

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

相关文章

高完整性系统(3):Threat Modelling

文章目录 基础安全性质保密性(Confidentiality)完整性(Integrity)可用性(Availability)认证(Authentication)不可抵赖性(Non-repudiation)访问控制&#xff0…

从开源软件看动态内存分配

动态内存分配 我们通常在C里面动态分配内存,会写出下面这样的代码: struct header {size_t len;unsigned char *data; }; 随后为data malloc一段内存出来,那么还有其他办法吗? 那便是弹性数组!在阐述本节之前&#xff…

数据安全有隐患?金仓数据60秒邀你闯关破题赢奖品

数字时代 数据成为宝贵资产 数据的安全 更是关乎行业可持续发展 关乎社会的稳定和国家战略 数据库作为 数据安全的首要防线 如何纵深防御 保障数据安全合规 满足新应用新场景下的安全防护要求 金仓数据60秒 发布多个视频为您详细剖析 同时,小编发起“闯关挑战”活动…

【Linux】14. 文件缓冲区

1. 文件缓冲区的引出 如上现象,在学习完文件缓冲区之后即可解释 2. 认识缓冲区 缓冲区的本质就是内存当中的一部分,那么是谁向内存申请的? 是属于谁的? 为什么要存在缓冲区呢? 道理是如此,在之前的学习过…

基于matlab仿真带有飞机的虚拟场景

一、前言 此示例演示如何通过 MATLAB接口使用空间鼠标。 开始此示例后,带有飞机的虚拟场景将显示在 Simulink 3D 动画查看器中。您可以使用空格鼠标在场景中导航平面。通过按下设备按钮 1,您可以在当前平面位置放置标记。 此示例需要空间鼠标或其他兼容设…

Neuralangelo AI - 视频生成3D模型

NVIDIA Research 宣布了 Neuralangelo,这是一种创新的 AI 模型,它利用神经网络的力量从 2D 视频剪辑中重建详细的 3D 结构。 Neuralangelo 能够生成逼真的建筑物、雕塑和其他现实世界物体的虚拟复制品,展示了 AI 在 3D 重建领域的非凡潜力。…

十个国内可用的智能AI模型

AI语言模型,就是一种利用机器学习和自然语言处理技术进行文本生成的算法。其基于大量已有的语料库进行训练,建立出一个能够理解自然语言规律和特征的语言模型。对于输入的文本、任务和目标,AI语言模型可以快速生成对应的结果。 在实际应用中&…

Flume入门监控端口数据官方案例

Flume安装部署 相关地址 Flume官网地址:http://flume.apache.org/文档查看地址:http://flume.apache.org/FlumeUserGuide.html下载地址:http://archive.apache.org/dist/flume/ 安装 将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/s…

责任链模式的学习与使用

1、责任链模式的学习 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦,使多个对象都有机…

计算机网络通信过程

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

案例|某城商行Zabbix 监控架构分享

编者荐语: 东莞银行董天保将出席7月份Zabbix大会分享案例经验,欢迎参加! 以下文章来源于有田菜也香 ,作者AcidGo 东莞银行董天保先生将于7月份参加Zabbix大会分享使用经验,欢迎扫码参加! 【导读】某银行…

openCV(三)绘制几何图形

openCV内置了几何图形绘制函数,通过简单的操作就可以绘制几何图形。例如,可以绘制直线、矩形、圆形、椭圆、多边形、文字等,分别对应函数cv2.line()、cv2.rectangle()、cv2.circle()、cv2.ellipse()、cv2.polylines()、cv2.putText()。 下面来…

Mysql进阶【3】论述Mysql优化

1.通过explain查看sql的详细信息 Mysql的sql优化企业里边主要是对慢sql进行优化,对语句进行优化,对索引进行优化 通过explain查看sql的详细信息,并且分析sql语句存在的问题,比如有没有使用到索引、使用了索引还是慢是不是索引设…

第一章_从减库存聊起

在多线程高并发场景下,为了保证资源的线程安全问题, jdk 为我们提供了 synchronized 关键字和 ReentrantLock 可重入锁,但是它们只能保证一个 jvm 内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同…

2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿

这一期主要分享一下此次京东618预售期间的一个黑马行业——传统滋补。不管是从预售量和预售额来看,传统滋补品类的成绩都是此次大促中的佼佼者。 究其原因,近几年养生滋补也掀起了一股“国潮风”。在小红书、抖音等社交平台上,关于“健康养生…

车载摄像头专用——拓尔微低功耗超高集成PMIC TMI7205B

“2023将是汽车行业的大变革之年,全球迎来L2向L3/L4跨越窗口。”越高级别的自驾对周围环境感知要求越高,车载摄像头“高清化”势不可挡,目前已从传统的100万直接跃升至800万像素摄像头,甚至在供应层面,已有超1500万高像…

Vue.js 中的 $forceUpdate 方法是什么?有什么作用?

Vue.js 中的 $forceUpdate 方法是什么?有什么作用? 在 Vue.js 中,$forceUpdate 方法是一个很常见的方法之一。它可以强制组件重新渲染,从而让组件的视图更新。本文将介绍 $forceUpdate 方法的使用方法和作用,并给出一…

代码随想录算法训练营第二天| 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵||

LeetCode977.有序数组的平方 链接:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 看到这道题,我第一反应就是把每个数的平方算出来然后排序&#xff…

结构体大小的计算

结构体计算要遵循字节对齐原则。 结构体默认的字节对齐一般满足三个准则: 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需…

【并发篇】04 线程池核心参数

这道题其实就是在问java中线程池的实现类ThreadPoolExecutor,这个类参数最多的构造方法有7个参数。 线程池本质上就是管理一组线程,用来执行提交给线程池的任务。提交任务用的是submit(task)。 corePoolSize设置核心线程数。核心线程执行完任务后仍然需…