Lua中常见的数据结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pg_dog/article/details/79538572

—————————————-array

a = {} –数组大小不确定,可动态增长

for i = 1,1000 do
    a[i] = 0
end

–可以用构造器在创建数组的同时初始化数组:

a = {1,2,3,4,4,5,6}

—————————————-矩阵和多维数组
–表示矩阵的方式1:数组的数组

mt = {}
for i = 1,M do
    mt[i] = {}    --显式的创建一个table
    for j = 1,N do
        mt[i][j] = 0
    end
end

–表示法2:

mt = {}
for i = 1,M do
    for j = 1,N do
        mt[i*M + j] = 0
    end
end

—————————————链表

--根节点
list = nil
--在链表开头插入一个值为v的节点
list = {next = list,value = v}
--遍历链表
local l = list
while l do
    print(l.value)
    l = l.next
end

—————————————队列和双向队列

--为了避免污染全局命名空间,将其放入一个名为list的table中:
List = {}
function List.new ()
    return {first = 0,last = -1}
end

–实现插入和删除操作

function List.pushleft(list,value)
    local first = list.frist - 1
    list.first = first
    list[first] = value
end

function List.pushright(list,value)\
    local last = list.last + 1
    list.last = last
    list[last] = value
end

function List.popleft(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

function List.popright(list)

————————————–集合和包
–想列出一段源代码中出现的所有标识符,你需要过滤掉那些语言本身的保留字

--lua中将一个集合的元素作为下标存放在table中,下面不需要查找table,只需测试给定元素在table中所对应的值是否为nil
function Set(list)   --构造集合
    local set = {}
    for _,l in ipairs(list) do
        set[l] = true
    end
    return set
end

reserved = Set{"while","for","end","local"}
for w in allwords() do
    if reserved[w] then
        --'w' is a reserved word
        ...
end

————————————–字符串缓冲

--table.concat函数可以将一个列表中的所有串合并
--Concat接受第二个可选的参数,代表插入的字符串之间的分隔符
local t = {}
for line in io.lines() do
    table.insert(t,line)
end
s = table.concat(t,"\n") .."\n"

–io.lines迭代返回不带换行符的一行,concat在字符串之间插入分隔符,但是在最后一个字符串之后不会插入分隔符,因此需要在最后加上一个分隔符。最后一个连接操作复制了整个字符串,这个字符串可能很大。这时可以使用小技巧,插入一个空串。

table.insert(t,"")
s = table.concat(t,"\n")

猜你喜欢

转载自blog.csdn.net/Pg_dog/article/details/79538572