数组
虽然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]={}
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
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
list=List.new();
for i=1,10,2 do
List.pushfirst(list,i);
end
for i=-5,
print(list[i])
end
for i=1,10,2 do
List.pushlast(list,i);
end
for i=0,
print(list[i])
end
print(List.popfirst(list));
print(List.poplast(list));
集合
使用字符串来搜索这个数组,只需用该值来索引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",}