Lua 学习笔记(十)数据结构

     在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

原文地址:https://www.cnblogs.com/Richard-Core/p/4380734.html