首页 > 其他 > 详细

十分钟学会Lua四:数据结构

时间:2022-05-27 22:36:43      阅读:7      评论:0      收藏:0      [点我收藏+]

四:数据结构

       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

看到这里麻烦点个关注吧,会不断分享知识的

十分钟学会Lua四:数据结构

原文:https://www.cnblogs.com/achevery/p/15358320.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!