四:数据结构
Lua语言中的表不是一种数据结构,是其他数据结构的基础。通过使用表,来实现数组、列表、集合、包和图等数据结构。
(1)数组:简单地使用整数来索引表即可实现数组。如:
local a=0
for i=1,200 do
a[i]=0
end
(2)矩阵及多维数组:使用如下代码来创建一个全0元素的N*M维矩阵:
local = {}
for i=1,N do
local row = {}
mt[i] = row
for j=1,M do
row[j]=0
end
end
(3)链表:每个节点使用表来实现,链接为指向下一个表的引用。在表头插入一个值为1的元素,如下:list={next=list,value=1}。可以通过如下的方式遍历列表:
local l=list
while l do
visit l.value
l=l.next
end
(4)队列及双端队列:
function listNew ()
return {first = 0, last = -1}
end
function pushFirst (list ,value)
local first = list.first – 1
list.first = first
list[first] = value
end
function pushLast (list, value)
local last = list.last + 1
list.last = last
list[last] = value
end
function popFirst (list)
local first = list.first
if first > list.last
then error("list is empty " )
end
local value = list[first]
list[first] = nil --使得元素能够被垃圾回收
list.first = first + 1
return value
end
(5)反向表:在Lua语言中我们很少进行搜素操作。我们使用被称为索引表(index table)或反向表(reverse table)的数据结构。
假设有一个存放了一周每一天名称的表:
days = { " Sunday" , "Monday", "Tuesday", "Wednesday" ," Thursday", "Friday" , "Saturday"}
如果想要将一周每一天的名称转换为其在一周里的位置,可以构造一个反向表,假定为revDays,该表中的索引为一周每一天的名称而值为其在一周里的位置。这个表形如:
revDays = {[" Sunday" ] = 1,[ "Monday"] = 2,[ "Tuesday"] = 3,["Wednesday"] = 4, ["Thursday"] = 5,["Friday"] = 6,[ " Saturday"] = 7}
(6)字符串缓存区:由于Lua中字符串是不可变值,在循环逐行读取文件时,会造成每读取一行字符串就复制一次,内存移动一次,造成极大地内存负担。对于这个问题,我们可以把一个表当作字符串缓冲区,其关键是使用函数table.concat。这个函数的作用是会将指定列表中的所有字符串连接起来并返回连接的结果。所以文件的读入可以这样:
local table1={} --初始化一个表
for line in io.lines() do --循环读入文件行
table1[#table1+1]=line .. “\n” --将每一行分别放入表作为表一元素
end
local s=table.contact(t,”\n”) --使用函数table.concat连接
(7)图:Lua中表示图的方式有多种。下面介绍一种有向图的一种实现方式。我们使用一个由两个字段组成的表来表示每个节点,即name (节点的名称)和adj(与此节点邻接的节点的集合)。由于我们会从一个文本文件中加载图对应的数据,所以需要能够根据节点的名称来寻找指定节点的方法。因此,我们使用了一个额外的表来建立节点和节点名称之间的映射。
代码如下:
function readgraph () --该函数逐行地读取一个文件,文件每一行中有两个节点的名称
local graph = {} --初始化建立节点与节点名称的映射的表
for line in io.lines() do --把一行分割为两个名字
local namefrom,nameto = string.match(line,"(%S+)%s+(%S+)") --找到对应的节点
local from = name2node(graph,namefrom) --将结点和它的名字存储到gragh中
local to = name2node( graph,nameto) --同上
from.adj[to] = true --使用adj这个表来存储节点之间的连接关系
end
return graph
end
local function name2node (graph,name )
local node = graph[name]
if not node then --节点不存在,创建一个新节点
node = {name = name, adj = {}}
graph[name] = node
end
return node
end
看到这里麻烦点个关注吧,会不断分享知识的
原文:https://www.cnblogs.com/achevery/p/15358320.html