在Lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础。其他语言提供的数据结构,如数组、记录、线性表、队列、集合等,在Lua中都可以通过table来表示。而且使用Lua实现这些数据结构的效率高。
一、数组
在Lua中数组没有固定的大小,可以根据需要增加长度。当初始化数组时,也就间接的定义了它的大小。
二、矩阵与多维数组
在Lua中,有两种方式来表示矩阵,一种是使用一个“数组的数组”,也就是数组中的元素是数组。另一种方式就是合并索引的方式,合并索引也有两种方式,加入索引分隔符和计算合值的方式。
合并索引方式,一个table存储所有的值。
1、计算合值,( idx - 1 )*M + idy 的方式算出每次索引的值
2、加入分隔符,N..S..M 使用字符串连接的方式实现唯一key
三、链表
由于Lua中table是动态的实体,所以在Lua中实现链表是很方便的。每一个链表结点以table来表示,结点包含两个值next和value,注意尾结点的next是nil。
四、双向队列
Lua中队列的实现有一种比较简单的实现方法就是使用table库函数insert和remove。这两个函数可以在一个数组的任意位置插入和删除元素,并且根据操作要求移动后续的元素。不过对于较大的结构,移动的开销是很大的。一种更高效的实现是使用两个索引,分别用于首尾的两个元素,及双向队列:
--双向队列的实现 DoubleQueue = {} function DoubleQueue.new() local Queue = { first = 0, last = -1 } function Queue.pushFirst( queue,value ) local first = queue.first -1 queue.first = first queue[ first ] = value end function Queue.popFirst( queue ) local first = queue.first if first > queue.last then error(" queue is empty! ") end local value = queue[first] queue[first] = nil queue.first = first +1 return value end function Queue.pushLast( queue,value ) local last = queue.last +1 queue.last = last queue[last] = value end function Queue.popLast( queue ) local last = queue.last if last < queue.first then error( " queue is empty! " ) end local value = queue[last] queue[last] = nil queue.last = last -1 return value end function Queue.len( queue ) return queue.last - queue.first +1 end return Queue end