在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 = , last = - }
function Queue.pushFirst( queue,value )
local first = queue.first -
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 +
return value
end function Queue.pushLast( queue,value )
local last = queue.last +
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 -
return value
end function Queue.len( queue )
return queue.last - queue.first +
end
return Queue
end

Lua 学习笔记(十)数据结构的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  3. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  4. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  5. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  6. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  7. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  8. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  9. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  10. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

随机推荐

  1. Web开发者需养成的好习惯

    Web开发者需养成的8个好习惯 每个行业有着每个行业的标准和一些要求,自己只是一个进入前端领域的小白,但是深刻的知道,习惯很重要,就Web开发分享一下,要养成的一些好的习惯. 优秀的Web开发人员工作 ...

  2. ThreadPoolExecutor源码学习(2)-- 在thrift中的应用

    thrift作为一个从底到上除去业务逻辑代码,可以生成多种语言客户端以及服务器代码,涵盖了网络,IO,进程,线程管理的框架,着实庞大,不过它层次清晰,4层每层解决不同的问题,可以按需取用,相当方便. ...

  3. String对象方法扩展

    /** *字符串-格式化 */ String.prototype.format = function(){ var args = arguments;//获取函数传递参数数组,以便在replace回调 ...

  4. Python之路第一课Day4--随堂笔记(迭代生成装饰器)

    上节回顾: 1.集合 a.关系测试 b.去重 2.文件操作及编码 3.函数 4.局部变量和全局变量 上节回顾 本节课内容: 1.迭代器生成器 2.装饰器 3.json pickle数据序列化 4.软件 ...

  5. pythonchallenge 解谜 Level 2

    好吧,赶紧贴一下. #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 2 import re file = open("Level 2.txt ...

  6. ormlite的使用方法

    ormlite是什么? 简单来说,就是我们定义一个实体类,利用这个框架,它可以帮我们吧这个实体映射到我们的数据库中,在Android中是SQLite,数据中的字段就是我们定义实体的成员变量. 官网地址 ...

  7. eclipse构建maven的web项目

    如果以后要创建maven的web项目,可以参考这个链接 http://blog.csdn.net/smilevt/article/details/8215558/

  8. IOS网络第七天WebView-04仿网易新闻详情

    *************** #import "HMViewController.h" @interface HMViewController () @end @implemen ...

  9. Jmeter之参数化

    Jmeter参数化分为两类,一类是在badboy录制脚本时进行参数化,二是再Jmeter里进行参数化 一:badboy录制脚本时进行参数化的步骤 1.脚本录制成功后->在左下角,点击variab ...

  10. 细说 Data URI

    Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放 ...