Lua学习笔记之数据结构

本文深入探讨了Lua中数组、单链表、集合、字符串缓冲区和图的基本概念及应用,通过具体代码实例展示了如何在Lua环境中进行数据结构的创建、修改和操作。

in Lua 一切数据结构皆由table带来

数组array

a = {}
for i = -5, 5 , 1 do
    a[i] = 0
end

print(a[0])
print(#a)  -- 5 

数组中,可以用任何任何数字下标来索引元素,但是如果用#来对数组求长度,它只能返回从1开始的连续元素个数。

单链表list

list = {}
list.insertnode = function ( v )
    -- body
    list.link = { nextv = list.link , value = v }
end

list.output = function (  )
    -- body
    local link = list.link  -- 保留头结点不要被丢掉
    while link do
        print(link.value)
        link = link.nextv
    end
end

list.insertnode( 1 )
list.insertnode( 2 )
list.insertnode( 3 )
list.insertnode( 4 )
list.insertnode( 5 )

list.output()

链表的操作函数和链表本身封装在一起,都放在list当中,但是,本质是link,需要理解这样的写法是每一个节点都指向了一个新的链表,递归的理解这种定义方式比较舒服。

集合set

reserved = {
    ["while"] = true, ["end"] = true,
    ["function"] = true, ["local"] = true,
}

就是保留字本身作为这个table的关键字。因为while,end等都是lua中的关键字,所以需要使用[“while”]来定义,否则直接 while= true是不行的。

string buffer

--io.read("*all")
local buff = “”
for line in io.lines() do
buff = buff..line..’\n’
end

这段代码读取350KB大小的文件需要将近1分钟。

local t = {}
for line in io.lines() do
    t[ #t + 1 ] = line
end
local s = table.concat(t,’\n’)

用这段代码读取350KB大小的文件 需要 0.5秒的时间。

图graph

local function name2nade( graph, name )
    if not graph[name] then
        --节点不存在,创建一个新的
        graph[name] = { name = name, adj = {} }
    end
    return graph[name]
end

function readgraph( )
    -- body
    local graph = {}
    for line in io.lines() do
        --切分行中的两个名称
        local namefrom , nameto = string.match(line,
                                    "(%S+)%s+(%S+)")
        -- 根据名称,得到相应的节点
        local from = name2node( graph , namefrom )
        local to = name2node( graph , nameto )
-- 将 ’to’ 节点添加到 ‘from’的邻接集合
        from.adj[to] = true
    end
    return graph
end

由于lua本身很容易实现稀疏矩阵,那么,图本身就是一个二维数组,( i , j )节点用来表示 从i,j 的边此时可以赋值value来表示这个边的权重。无向图,对称矩阵,或三角矩阵表示就好。

转载于:https://www.cnblogs.com/appleegig/p/3901811.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值