Lua学习笔记-数据结构

来源:互联网 发布:python product 函数 编辑:程序博客网 时间:2024/05/13 13:16

1、数组

使用整数来索引table即可在Lua中实现数组。因此,Lua中的数组没有固定的大小。注意,其索引是从1开始的,这与C++不同。

代码:

squares = {1, 4, 9, 16, 25};len=#squares;for i=1,len doprint("ayyr:"..i..":"..squares[i]);endprint("length"..#squares)

2、二维数组

在Lua中我们可以通过两种方式来利用table构造多维数组。其中,第一种方式通过“数组的数组”的方式来实现多维数组的,即在一维数组上的每个元素也同样为table对象

A ={};N=4;M=5;for i=1,N doA[i]={};for j=1,M doA[i][j]=i+j;print("ayyr:"..i..","..j..":"..A[i][j]);endendprint("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 doA[(i-1)*M+j]=i+j;--print("ayyr:"..i..","..j..":"..A[i][j]);endendprint("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=nilfor i=1,10 dolist={next=list,value=i}end--打印结果l=listwhile l doprint("value:"..l.value)l=l.nextend

4、队列和双向队列

虽然可以使用Lua的table库提供的insert和remove操作来实现队列,但这种方式实现的队列针对大数据量时效率太低,会导致后续元素的移动。更有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。

代码:

List = {}--创建function List.new()return {first = 0,last = -1}end--队列头插入function List.pushFront(list,value)local first = list.first - 1list.first = firstlist[first] = valueend--队列尾插入function List.pushBack(list, value)local last = list.last + 1list.last = lastlist[last] = valueend--队列头部取数据function List.popFront(list)local first = list.firstif first > list.last thenerror("List is empty")endlocal value = list[first]list[first] = nillist.first = first + 1return valueend--队列尾部取数据function List.popBack(list)local last = list.lastif list.first > last thenerror("List is empty")endlocal value = list[last]list[last] = nillist.last = last - 1 return valueend-- 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 doList.pushBack(testList,i)endprint(table.maxn(testList))----打印结果,与入队列的顺序相同print("队列中元素:"..#testList)--是有结果的,但是结果是9个?为何不是10个?for i=1,15 do -- 15大于实际的存储数量,print( List.popBack(testList))end

总之,各个数据结构都是基于table进行演化出来的。








0 0
原创粉丝点击