• 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

  • 相关阅读:
    Linux系统常用工具集
    Storm安装部署
    Linux下搭建Elasticsearch7.6.2集群
    解决SpringMVC @RequestBody无法注入基本数据类型
    微服务概念
    HashMap的原理简单介绍
    mysql进阶
    vue 路由缓存 keep-alive include和exclude无效
    el-date-picker 时间日期格式,选择范围限制
    RedisTemplate使用rightPushAll往list中添加时的注意事项
  • 原文地址:https://www.cnblogs.com/Richard-Core/p/4380734.html
Copyright © 2020-2023  润新知