支持分页的环形队列(多环队列)

最近我因工作需要使用环形队列,并在常规环形队列上拓展为支持分页环形队列,用于高效地管理大量数据,支持高效的元素添加、删除及分页数据的访问。通过分页的方式,它可以有效地管理大规模的数据集合

源码

-- 创建一个分页的环形队列
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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值