数组
虽然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",}