1. 程式人生 > >雙向佇列的實現

雙向佇列的實現

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

輸出如下: