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天前
|
算法
栈刷题记(二-用栈操作构建数组)
栈刷题记(二-用栈操作构建数组)
|
2天前
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
栈刷题记(一-有效的括号)
|
4天前
|
算法 索引
数据结构与算法-三种队列基础入门
数据结构与算法-三种队列基础入门
8 0
|
5天前
|
存储 C语言
数据结构基础:双链表结构、实现
数据结构基础:双链表结构、实现
|
5天前
|
存储
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)
|
5天前
|
C语言
数据结构中顺序栈的进栈和出栈用C语言表示
数据结构中顺序栈的进栈和出栈用C语言表示
13 1
|
5天前
|
存储
线性表、链表、栈和队列的初始化
线性表、链表、栈和队列的初始化
10 1
|
15天前
|
存储 算法 调度
数据结构期末复习(3)栈和队列
数据结构期末复习(3)栈和队列
19 0
|
15天前
数据结构—链表(超详细)(山东大学)(数据结构实验三)
数据结构—链表(超详细)(山东大学)(数据结构实验三)
数据结构|双向链表|带头结点|头插|尾插|尾删|头删
数据结构|双向链表|带头结点|头插|尾插|尾删|头删