Lua Table实现经典数据结构 (链表 | 栈 | 双端队列)

在这里插入图片描述
在这里插入图片描述

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()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღCauchyོꦿ࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值