双向队列的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaixh_89/article/details/84937272

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

输出如下:

猜你喜欢

转载自blog.csdn.net/zhaixh_89/article/details/84937272