in Lua 一切数据结构皆由table带来
数组array
a = {}for i = -5, 5 , 1 do a[i] = 0endprint(a[0])print(#a) -- 5
数组中,可以用任何任何数字下标来索引元素,但是如果用#来对数组求长度,它只能返回从1开始的连续元素个数。
单链表list
list = {}list.insertnode = function ( v ) -- body list.link = { nextv = list.link , value = v }endlist.output = function ( ) -- body local link = list.link -- 保留头结点不要被丢掉 while link do print(link.value) link = link.nextv endendlist.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() dobuff = buff..line..’\n’end
这段代码读取350KB大小的文件需要将近1分钟。
local t = {}for line in io.lines() do t[ #t + 1 ] = lineendlocal 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]endfunction 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 graphend
由于lua本身很容易实现稀疏矩阵,那么,图本身就是一个二维数组,( i , j )节点用来表示 从i,j 的边此时可以赋值value来表示这个边的权重。无向图,对称矩阵,或三角矩阵表示就好。