基于数组和链表实现队列

简介: 创建大数组实现对象:里面包含的信息公共初始化: 初始化页工厂:索引页工厂、数据页工厂、元数据页工厂,初始化数组索引、初始化数据页索引,通过队列前置索引页工厂获取索引页,获取队列front索引buffer,获取front,也即索引。这个实现和kafka是类似的,也即需要有相关页信息入队列:进行入队操作是一个追加的操作,首先判断容量是否够,不够,则进行扩容操作。通过缓存拿到映射页实现,然后通过映射页。再通过锁,仅锁定创建页,索引用完后进行移除操作,映射页面实现,使用双向校验,如果为空,则创建页索引对象,通过索引拿到文件名称,然后通过读写通道进行读写操作。使用fileChannal调用映射方法获取

队列是FIFO先进先出的数据结构。一般情况下,如果是对一些及时消息的处理,并且处理时间很短的情况下是不需要队列的,直接阻塞式的方法调用就可以了。但是如果在消息处理的时候特别费时间,这个时候如果有新消息来了,只能处于阻塞状态,造成用户等待。这个时候就需要引入队列了。当接收到消息后,先把消息放入队列中,然后再用新的线程进行处理,这个时候就不会有消息阻塞了。所以队列用来存放等待处理元素集合。这种场景一般用于缓冲、并发访问,及时消息通信、分布式消息队列等。

基于数组和链表实现队列,在java中有ArrayBlockingQueue和LinkedBlockingQueue。基于数组实现的队列是有界的,同时也是有序的,因此其可以叫做顺序队列。而基于链表实现的阻塞队列则是无界的。

基于数组实现队列:

微信图片_20221214031816.png

入队列操作:将角标tail进行++即可

微信图片_20221214031819.png

入队

出队列:将角标head--即可

微信图片_20221214031822.png

出队

基于双向链表实现队列:

入队操作:判断当前尾节点是否存在,如果不存在,则说明当前节点是新添加的第一个节点,否者说明当前的节点不是第一个,此时需要将尾节点的下一个节点变成 添加元素节点,大小+1,同时将尾节点设置为当前入队的节点。出队操作:如果头节点为空,则直接返回空,否则拿到当前头节点数据,同时将头节点指向头节点的下一个节点。如果头节点为空,则将tail节点设置为空。否者,将大小-1,同时返回数据。

微信图片_20221214031824.png


入队列:将当前节点赋值给尾节点的下一个节点,同时将当前节点赋值为尾节点

微信图片_20221214031827.png

                                                入队

出队列:获取当前头节点数据,如果当前头节点的下一个节点赋值给头节点,如果头节点为空,则说明当前只有一个元素,则此时需要将尾节点设置为null,否者将队列的大小进行--,然后返回数据。

微信图片_20221214031830.png


出队

如果要实现一个大队列,则此时需要考虑什么呢,或者说可以基于什么数据结构实现呢?

要实现一个大队列,则此时可以基于数组或者基于链表实现,此时需要考虑采用文件的形式进行存储,使用缓冲区。此时有下面的思路:

创建大数组实现对象:里面包含的信息公共初始化:初始化页工厂:索引页工厂、数据页工厂、元数据页工厂,初始化数组索引、初始化数据页索引,通过队列前置索引页工厂获取索引页,获取队列front索引buffer,获取front,也即索引。这个实现和kafka是类似的,也即需要有相关页信息入队列:进行入队操作是一个追加的操作,首先判断容量是否够,不够,则进行扩容操作。通过缓存拿到映射页实现,然后通过映射页。再通过锁,仅锁定创建页,索引用完后进行移除操作,映射页面实现,使用双向校验,如果为空,则创建页索引对象,通过索引拿到文件名称,然后通过读写通道进行读写操作。使用fileChannal调用映射方法获取映射字节缓冲区,创建映射页面实现对象,在缓存中放入索引和mpi对象、ttl值。拿到追加数据页缓冲区,放入数据,并创建目录。更新偏移量,更新索引,更新元数据。出队列:使用锁,如果当前队列为空,则直接返回。获取队列头索引,通过队列索引拿到数据,如果索引
目录
相关文章
|
2月前
|
Java
环形数组链表(java)
环形数组链表(java)
19 0
|
2月前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
36 0
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0
|
1月前
|
存储
数组与链表有什么区别
数组与链表有什么区别
|
2月前
|
数据安全/隐私保护
第2章 栈、队列、链表
第2章 栈、队列、链表
|
2月前
|
存储 算法 Java
数组与链表
数组与链表
|
2月前
|
Java
数组链表(java)
数组链表(java)
20 0
|
3月前
|
算法 测试技术
【数据结构与算法 | 基础篇】单向循环链表实现队列
【数据结构与算法 | 基础篇】单向循环链表实现队列
|
2月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
2月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表