lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础,如:数组,记录,链表,队列等都可以用它来表示。

1、数组

在lua中,table的索引可以有很多种表示方式。如果用整数来表示table的索引,即可用table来实现数组,在lua中索引通常都会从1开始。

--二维数组
n= m=
arr={}
for i=,n do
arr[i]={}
for j=,m do
arr[i][j]=i*j
end
end for i=, n do
for j=, m do
if(j~=m) then io.write(arr[i][j].." ")
else print(arr[i][j])
end
end
end

2、链表

在lua中,由于table是动态的实体,所以用来表示链表是很方便的,其中每个节点都用table来表示。

list = nil
for i = , do
list = { next = list, value = i}
end local l = list
while l do
print(l.value)
l = l.next
end

3、队列与双端队列

在lua中实现队列的简单方法是调用table中insert和remove函数,但是如果数据量较大的话,效率还是很慢的,下面是手动实现,效率快许多。

List={}

function List.new()
return {first=, last=-}
end function List.pushFront(list,value)
list.first=list.first-
list[ list.first ]=value
end function List.pushBack(list,value)
list.last=list.last+
list[ list.last ]=value
end function List.popFront(list)
local first=list.first
if first>list.last then error("List is empty!")
end
local value =list[first]
list[first]=nil
list.first=first+
return value
end function List.popBack(list)
local last=list.last
if last<list.first then error("List is empty!")
end
local value =list[last]
list[last]=nil
list.last=last-
return value
end lp=List.new()
List.pushFront(lp,)
List.pushFront(lp,)
List.pushBack(lp,-)
List.pushBack(lp,-)
x=List.popFront(lp)
print(x)
x=List.popBack(lp)
print(x)
x=List.popFront(lp)
print(x)
x=List.popBack(lp)
print(x)
x=List.popBack(lp)
print(x)
--输出结果
--
-- -2
--
-- -1
-- lua:... List is empty!

4、集合和包

在Lua中用table实现集合是非常简单的,见如下代码:
    reserved = { ["while"] = true, ["end"] = true, ["function"] = true, }
    if not reserved["while"] then
        --do something
    end
    在Lua中我们可以将包(Bag)看成MultiSet,与普通集合不同的是该容器中允许key相同的元素在容器中多次出现。下面的代码通过为table中的元素添加计数器的方式来模拟实现该数据结构,如:

function insert(Bag,element)
Bag[element]=(Bag[element] or )+
end function remove(Bag,element)
local count=Bag[element]
if count > then Bag[element]=count-
else Bag[element]=nil
end
end

5、StringBuild

如果在lua中将一系列字符串连接成大字符串的话,有下面的方法:

低效率:

local buff=""
for line in io.lines() do
buff=buff..line.."\n"
end

高效率:

local t={}

for line in io.lines() do
if(line==nil) then break end
t[#t+]=line
end local s=table.concat(t,"\n") --将table t 中的字符串连接起来

Lua数据结构的更多相关文章

  1. [转]lua数据结构--闭包

    前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – 函数的结构.函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实 ...

  2. Step By Step(Lua数据结构)

    Step By Step(Lua数据结构) Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示.     ...

  3. Lua数据结构的学习笔记

    更多详细内容请查看:http://www.111cn.net/sys/linux/59911.htm table是Lua中唯一的数据结构,其他语言所提供的其他数据结构比如:arrays.records ...

  4. Lua之Lua数据结构-TTLSA(6)(转) good

    一. tabletable是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构 ...

  5. lua数据结构之table的内部实现

    一.table结构 1.Table结构体 首先了解一下table结构的组成结构,table是存放在GCObject里的.结构如下:   typedef struct Table {   CommonH ...

  6. Lua 数据类型和 Redis 数据类型之间转换

    当 Lua 通过 call() 或 pcall() 函数执行 Redis 命令的时候,命令的返回值会被转换成 Lua 数据结构. 同样地,当 Lua 脚本在 Redis 内置的解释器里运行时,Lua ...

  7. Redis学习-LUA脚本

    最近在做K线的项目中,需要计算商品的分时数据.为了保证多台机器对同一商品的计算的有序性,所以在Redis中进行计算,同时为了保证在分时数据计算过程的原子性所以使用了LUA脚本,Redis内置了对LUA ...

  8. 【游戏开发】Excel表格批量转换成lua的转表工具

    一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游 ...

  9. 高性能伪事务之Lua in Redis

    EVAL简介 Redis2.6加入了对Lua脚本的支持.Lua脚本可以被用来扩展Redis的功能,并提供更好的性能. 在<Redis拾遗>中曾经引用了<Redis in Action ...

随机推荐

  1. 【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别

    给出以下的代码展示: //绑定 下一页 的点击事件 $("a[aria-label='Next']").click(function(){ $("a[aria-label ...

  2. BootSrap学习

    1.当row1里边有2个或多个col的时候,如果位置在后边的col的高度大于位置在前边的col,就可能会导致下一个row2在满足col-xs-*在满足和为12的情况下错乱分行.解决办法是强行给row1 ...

  3. 2016.8.14 HTML5重要标签及其属性学习

    1.移动端的CSS: 一般需要引入下面的外部样式表: <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/ ...

  4. 《DSP using MATLAB》示例Example5.2

    代码: L = 5; N = 20; k = [-N/2:N/2]; % square wave parameters xn = [ones(1,L), zeros(1,N-L)]; % Sq wav ...

  5. 【转】win8.1下安装ubuntu

    参考:http://jingyan.baidu.com/article/14bd256e0ca52ebb6d26129c.html Ubuntu 系统是一款优秀的.基于GNU/Linux 的平台的桌面 ...

  6. Visual Studio 设置 Inherited include Directories

    在用Visual Studio进行开发的时候,避免不了要使用一些常用的第三方提供的库.如果是一次两次设置还能让人忍受,但是如果要写很多项目的话,设置这些库真的很让人头疼.不过Visual Studio ...

  7. Block与代理的使用

    本人其实是比较喜欢用Block的,因为用block写出来的代码,让我感觉代码要紧凑一些,看起来的时候,思路要清晰些,所以这估计也就是现在block将要代替代理的原因所在吧! 下面,直接进入主题: 一. ...

  8. iOS instancetype or id ?

    The id type simply says a method will return a reference to an object. It could be any object of any ...

  9. three.js阴影

    <!DOCTYPE html> <html> <head> <title>Example 01.03 - Materials and light< ...

  10. Codeforces 653D Delivery Bears(最大流)

    题目大概说有一张n个点m条边的简单有向图,每条边只能允许一定总量的货物通过.要让x只熊从1点到n点运送货物,每只熊都要运送且运送的货物重量都一样,求该重量的最大值. 二分重量判断是否成立. 如果已知重 ...