1. 链表(list)
#!/usr/local/bin/lua
list = nil
for i = 1, 10 do
list = { ne = list, value = i } -- 头插
end
local l = list
while l do
print(l.value)
l = l.ne
end
2. 栈(stack)
#!/usr/local/bin/lua
local stack = {}
stack.__index = stack
function stack:new()
local obj = {}
setmetatable(obj, self)
obj.stackList = {}
return obj
end
function stack:top()
if self:size() == 0 then return nil end
return self.stackList[self:size()]
end
function stack:pop()
if #self.stackList == 0 then return end
return table.remove(self.stackList, self:size())
end
function stack:push(data)
table.insert(self.stackList, data)
end
function stack:size()
return #self.stackList
end
-- ::test:: --
local s = stack:new()
s:push(1)
s:push(2)
s:push(3)
s:push(4)
-- [[ bottom 1 2 3 4 top
while s:top() do
print(s:top())
s:pop()
end
local a = stack:new()
a:push(4)
a:push(3)
a:push(2)
a:push(1)
-- [[ bottom 4 3 2 1 top
while a:top() do
print(a:top())
a:pop()
end
3. 双端队列(deque)
#!/usr/local/bin/lua
function deque()
local queue = { first = 0, last = -1 }
local obj = {}
function obj.push_front(data)
local first = queue.first - 1
queue.first = first
queue[first] = data
end
function obj.pop_front()
local first = queue.first
if first > queue.last then
error("deque is empty")
end
local data = queue[first]
queue[first] = nil
queue.first = first + 1
return data
end
function obj.push_back(data)
local last = queue.last + 1
queue.last = last
queue[last] = data
end
function obj.pop_back()
local last = queue.last
if last < queue.first then
error("deque is empty")
end
local data = queue[last]
queue[last] = nil
queue.last = queue.last - 1
return data
end
function obj.size()
return queue.last - queue.first + 1
end
function obj.print()
local t = {}
for i = queue.first, queue.last do
t[#t + 1] = queue[i]
end
local s = table.concat(t, ", ")
print(s)
end
return obj
end
local deque = deque()
deque.push_front(1)
deque.push_back(2)
deque.pop_front()
deque.pop_back()