支持分页的环形队列(多环队列)
- 源码
- 解析
-
- PageCircularQueue 类
- readonly 函数
- PageCircularQueue.new 函数
- PageCircularQueue:enqueue 函数
- PageCircularQueue:dequeue 函数
- PageCircularQueue:peek 函数
- PageCircularQueue:reverse_peek 函数
- PageCircularQueue:isFull 函数
- PageCircularQueue:isEmpty 函数
- PageCircularQueue:getSize 函数
- PageCircularQueue:getRawPage 函数
- PageCircularQueue:getPage 函数
最近我因工作需要使用环形队列,并在常规环形队列上拓展为支持分页环形队列,用于高效地管理大量数据,支持高效的元素添加、删除及分页数据的访问。通过分页的方式,它可以有效地管理大规模的数据集合
源码
-- 创建一个分页的环形队列
local PageCircularQueue = {
}
PageCircularQueue.__index = PageCircularQueue
local function readonly(t)
local mt = {
__index = t,
__newindex = function (t, k, v) error("Attempt to modify read-only table", 2) end,
__pairs = function () return pairs(t) end,
__ipairs = function () return ipairs(t) end,
__len = function () return #t end,
__metatable = false
}
return setmetatable({
}, mt)
end
local E = readonly({
})
--tips: head指向的当前队列中最早入队的元素,tail指向的为最新入队的元素
---创建新的环形队列对象
---@param max_pages number @最大页
---@param page_capacity number @每页最大数量
---@field head_page number @最新页
---@field tail_page number @最尾页
---@field head number @头元素所在页的位置
---@field tail number @尾元素所在页的位置
---@field max_size number @队列容量
---@field size number @队列长度
---@field pages table @页数据
function PageCircularQueue.new(max_pages, page_capacity)
assert(max_pages > 0, "invalid max pages")
assert(page_capacity > 0, "invalid page capacity")
local self = setmetatable({
}, PageCircularQueue)
self.max_pages = max_pages
self.page_capacity = page_capacity
self.pages = {
} -- 存储每个页的数据
for i = 1, max_pages do
self.pages[i] = {
}
end
self.head_page = 1
self.tail_page = 1
self.head = 1
self.tail = 0
self.max_size = self.max_pages * self.page_capacity
self.size = 0
return self
end
-- 向队列中添加数据
function PageCircularQueue:enqueue(value)
if value == nil then
INFO("PageCircularQueue enqueue value is nil")
return false
end
if self.size == self.max_size then
-- 队列已满,覆盖最旧的元素
if self.head == self.page_capacity