1、数组
使用整数来索引table即可在Lua中实现数组。因此,Lua中的数组没有固定的大小。注意,其索引是从1开始的,这与C++不同。
代码:
squares = {1, 4, 9, 16, 25};
len=#squares;
for i=1,len do
print("ayyr:"..i..":"..squares[i]);
end
print("length"..#squares)
2、二维数组
在Lua中我们可以通过两种方式来利用table构造多维数组。其中,第一种方式通过“数组的数组”的方式来实现多维数组的,即在一维数组上的每个元素也同样为table对象
A ={};
N=4;
M=5;
for i=1,N do
A[i]={};
for j=1,M do
A[i][j]=i+j;
print("ayyr:"..i..","..j..":"..A[i][j]);
end
end
print("length"..#A)--N行
print("length"..#A[1])--M列
print(table.getn(A))--另外一种获取数组长度的方式
由于Lua中table是对象,所以每一行我们必须显式地创建一个table,比起c这显得冗余,但另一方面也提供了更多的灵活性,例如可修改前面的例子创建一个三角矩阵:
for j=1,M do
改成
for j=1,i do
这样实现的三角矩阵比起整个矩阵,仅使用一半的内存空间。
上面的方法是用数组的数组进行表示,即每一行都是一个表,再由这些表组成一个二维数组。
另外一种方式就是将二维数组的索引进行展开,以固定的常量作为第二维的步长:
代码:
A ={};
N=4;
M=5;
for i=1,N do
--A[i]={};
for j=1,M do
A[(i-1)*M+j]=i+j;
--print("ayyr:"..i..","..j..":"..A[i][j]);
end
end
print("length"..#A)--N行
--print("length"..#A[1])--M列
print(table.getn(A))--另外一种获取数组长度的方式
另外,可以采用字符型的索引,但是需要注意使用的时候,需要中括号和引号
table1 = {one = 0, two = true, three = "hello"}
table2 = {["one"] = 0, ["two"] = true, ["three"] = "hello"}
table3 = {}
table3.one = 0
table3.two = true
table3.three = "hello"
print(table2.one)
print(table2["one"])
3、链表
table是动态的实体,所以在Lua中实现链表。其中,每个结点均以table来表示,一个“链接”只是结点中的一个字段,该字段包含对其它table的引用
--链表操作
list=nil
for i=1,10 do
list={next=list,value=i}
end
--打印结果
l=list
while l do
print("value:"..l.value)
l=l.next
end
4、队列和双向队列
虽然可以使用Lua的table库提供的insert和remove操作来实现队列,但这种方式实现的队列针对大数据量时效率太低,会导致后续元素的移动。更有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。
代码:
List = {}
--创建
function List.new()
return {first = 0,last = -1}
end
--队列头插入
function List.pushFront(list,value)
local first = list.first - 1
list.first = first
list[first] = value
end
--队列尾插入
function List.pushBack(list, value)
local last = list.last + 1
list.last = last
list[last] = value
end
--队列头部取数据
function List.popFront(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.popBack(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
-- function List.getSize(list)
-- count=0
-- while list.first > last
-- then
-- return count
-- end
--测试代码
local testList = List.new()
List.pushFront(testList,1.2)
List.pushFront(testList,1.3)
List.pushFront(testList,1.4)
--方法1
-- for i=1,10 do
-- List.pushFront(testList,i)
-- end
-- --打印出结果,与入队列的顺序相反
-- print("队列中元素:"..#testLi<span style="display: none; width: 0px; height: 0px;" id="transmark"></span>st)--无效的,但是下面有结果?
-- for i=1,15 do -- 15大于实际的存储数量,
-- print( List.popFront(testList))
-- end
--方法2
--从尾部进行插入
for i=1,10 do
List.pushBack(testList,i)
end
print(table.maxn(testList))--
--打印结果,与入队列的顺序相同
print("队列中元素:"..#testList)--是有结果的,但是结果是9个?为何不是10个?
for i=1,15 do -- 15大于实际的存储数量,
print( List.popBack(testList))
end
总之,各个数据结构都是基于table进行演化出来的。