基于数组和链表实现队列

简介: 创建大数组实现对象:里面包含的信息公共初始化: 初始化页工厂:索引页工厂、数据页工厂、元数据页工厂,初始化数组索引、初始化数据页索引,通过队列前置索引页工厂获取索引页,获取队列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值。拿到追加数据页缓冲区,放入数据,并创建目录。更新偏移量,更新索引,更新元数据。出队列:使用锁,如果当前队列为空,则直接返回。获取队列头索引,通过队列索引拿到数据,如果索引
目录
相关文章
|
1月前
【数据结构】数组、双链表代码实现
【数据结构】数组、双链表代码实现
|
3月前
|
C++
数据结构01-线性结构-链表栈队列-栈篇
数据结构01-线性结构-链表栈队列-栈篇
|
3月前
|
存储 算法
速学数据结构 | 链表实现队列究竟有什么优势?
速学数据结构 | 链表实现队列究竟有什么优势?
30 0
|
1月前
|
Python
Python实现数据结构(如:链表、栈、队列等)。
Python实现数据结构(如:链表、栈、队列等)。
32 0
|
1月前
|
存储 算法
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问
22 0
|
2月前
数据结构 模拟实现Queue队列(双链表模拟)
数据结构 模拟实现Queue队列(双链表模拟)
21 1
|
3月前
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
28 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
|
3月前
|
Java Go C++
Golang每日一练(leetDay0116) 路径交叉、回文对
Golang每日一练(leetDay0116) 路径交叉、回文对
30 0
Golang每日一练(leetDay0116) 路径交叉、回文对
|
3月前
|
算法 C++ Python
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
27 0
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
|
3月前
|
Python Java Go
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II
46 0
Python每日一练(20230430) 移除元素、删除排序链表中的重复元素、搜索旋转排序数组II