数组

虽然Lua可以自定义下标,但在Lua中习惯上数组的下标从1开始,Lua的标准库与此习惯保持一致,因此如果你的数组下标也是从1开始你就可以直接使用标准库的函数,否则就无法直接使用。

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

print("数组 a 的长度:" .. #a);  --计算长度操作符 #

squares={1,2,3,4,5}; --在一个表达式中初始化数组

矩阵与多维数组

在Lua中,有两种方式来表示矩阵。第一种是使用一个”数组的数组”,也就是说,一个table中的每个元素是另一个table。例如:

mt={}
for i=1,N do
   mt[i]={}     --由于在Lua中table是一种对象,因此在创建矩阵时,必须显示地创建每一行。
   for j=1,M do
      mt[i][j]={}
    end
end

第二种方式是将两个索引合并为一个索引。例如:

m={}
for i=1,N do
   for j=1,M do
     m[(i-1)*M+j]= 0;
    end
end

链表

由于table是动态的实体,所以在Lua中实现链表是很方便的。每个节点以一个table来表示,一个”链接”只是节点table中的一个字段,该字段包含了对其他table的引用。

list = nil  
for i = 1, 10 do  
    list = { next = list ,value = i}  --插入元素
end  

local l = list  
while l do   --遍历列表
    --print(l.value)  
    l = l.next  
end

队列与双向队列

List={};
function List.new()
    return {first=0,last=-1};
end

--队列头插入
function List.pushfirst(list,value)
    local first=list.first-1;
    list.first=first;
    list[first]=value;
end

--队列尾插入  
function List.pushlast(list,value)
    local last=list.last+1;
    list.last=last;
    list[last]=value;
end

--返回队列头
function List.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

--返回队列尾
function List.poplast(list)
    local last=list.last;
    if list.first>last then error("list is empty")end
    local value=list[last];
    list[last]=nil;
    list.last=last-1;
    return value;
end


--测试1
list=List.new();  --创建一个队列

for i=1,10,2 do   --向队列头一次插入value 1,3,5,7,9 他们的下标为-1,-2,-3,-4,-5
   List.pushfirst(list,i);
end
for i=-5, #list do   --first 是从0 开始的,压入栈的时候 第一个元素  first = -5
   print(list[i]) 
end

--测试2
for i=1,10,2 do  --向队列尾部依次插入value,下标是从1开始。
   List.pushlast(list,i);
end

for i=0, #list do   --因为last 是从-1 开始的,压入栈的时候 第一个元素  last = 0
   print(list[i]) 
end


print(List.popfirst(list)); --9  队列头部插入的最后一个值为9
print(List.poplast(list));  --9  队列尾部插入的最后一个值为9

集合

使用字符串来搜索这个数组,只需用该值来索引table,并查看结果是否为nil。在Lua中,将集合元素作为索引放入一个table中。

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

for k,v in pairs(reserved) do  
    print(k,"->",v)  
end

若要使初始化过程变得更清晰,可以使用以下代码来创建集合:

function Set(list)
   local set={}
   for _,l in ipairs(list) do 
       set[l]=true 
    end
return set


reserved=Set{"while","end","function","local",}