双向队列的实现

c++中使用队列的话有queue(单项队列)、deque(双向队列),但在lua中并没有提供给我们可直接使用的这类数据结构,不过lua中有一个近乎万能的数据类型table,他可以实现其他语言中各种类型,今天在此先分享下双向列表的lua实现,原理就是保存一张表的首尾端索引,每次增删的时候修改下,并将push进来的值以索引为key保存起来,取值的时候再以索引为键取出即可,代码如下:

 

--双向队列实现
List = {}
function List:new()
    local t = {first = 0, last = -1}
    setmetatable(t, self)
    self.__index = self
    return t
end

function List:pushFirst(value)
    local first = self.first - 1
    self.first= first
    self[first] = value
end


function List:pushLast(value)
    local last = self.last + 1
    self.last = last
    self[last] = value
end

function List:popFirst()
    if(self.first > self.last) then
        error("list is empty")
    end
    local value = self[self.first]
    self[self.first]= nil
    self.first = self.first + 1
    return value
end

function List:popLast()
    if(self.first > self.last) then
        error("list is empty")
    end
    local value = self[self.last]
    self[self.last] = nil
    self.last = self.last - 1
    return value
end

local list = List:new()
list:pushFirst(2)
list:pushFirst(3)
list:pushFirst(4)
list:pushLast(5)
list:pushLast(6)
while list.first ~= 0 do
    local value = list:popFirst()
    print(value)
end

输出如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值