Lua学习笔记-数据结构

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进行演化出来的。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值