Lua中使用table实现的其它5种数据结构

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*n+j
end
end for i=, n do
for j=, m do
if(j~=m) then io.write(arr[i][j].." ") -- io.write 不会自动换行
else print(arr[i][j]) -- print 自动换行
end
end
end

2、链表

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

代码如下:

list = nil
for i = , do
list = {next = list, value = i}
end local ls = list
while ls do
print(ls.value)
ls = ls.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)
 

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中使用table实现的其它5种数据结构的更多相关文章

  1. 递归打印lua中的table

    在lua中,table是比较常用的数据形式,有时候为了打印出里面的内容,需要做一些特殊处理. 废话不多讲,直接粘代码: print = release_print -- 递归打印table local ...

  2. lua中遍历table的几种方式比较

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  3. lua中的table、stack和registery

    ok,前面准备给一个dll写wrapper,写了篇日志,看似写的比较明白了,但是其实有很多米有弄明白的.比如PIL中使用的element,key,tname,field这些,还是比较容易混淆的.今天正 ...

  4. Lua中的table函数库

    table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组 ...

  5. lua中求table长度

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  6. Lua中的table构造式(table constructor)

    最简单的构造式就是一个空构造式{},用于创建一个空table. 构造式还可以用于初始化数组.例如,以下语句:days = {"Sunday", "Monday" ...

  7. lua中求table长度--(转自有心故我在)

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  8. Lua中获取table长度

    -- table.getn(tableName) 得到一个table的大小,等同于操作符# -- 要注意的是:该table的key必须是有序的,索引是从1开始的. --例如有序的 local xian ...

  9. lua中使用table实现类和继承

    --因为只有当读写不存在的域时,才会触发__index和__newindex classA = {className = "classA",name="classAIns ...

随机推荐

  1. socket端口外网无法连接解决方法

    用socket做了个程序,本地测试没有问题,发布到服务器上时连接不上,用telnet测试连接失败 服务器上netstat -a 查看端口情况,127.0.0.1绑定端口9300处于监听状态,如下图: ...

  2. IOS7 点击空白处隐藏键盘的几种方法

    IOS7 点击空白处隐藏键盘的几种方法   iOS开发中经常要用到输入框,默认情况下点击输入框就会弹出键盘,但是必须要实现输入框return的委托方法才能取消键盘的显示,对于用户体验来说很不友好,我们 ...

  3. 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入

    ASP.net Core自带DI(依赖注入),用法如下: services.AddScoped(typeof(IProductService), typeof(ProductService)); 如果 ...

  4. 系统出现异常: too many values to unpack (expected 2)

    先感谢[ValueError: too many values to unpack](http://leonzhan.iteye.com/blog/1720315)系统出现异常:打开太多值(预期2)这 ...

  5. sql server作业实现数据同步

    作业介绍  SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作.作业可以执行一系列活动,包括运行Transact-SQL脚本.命令行应用程序.Microsoft Acti ...

  6. Windows系统下八大具有高逼格的DOS命令之一【ping】

    ping命令: ping是用来检测网络是否通畅或者查询网络连接速度的一个基础命令.作为一名对计算机痴迷的爱好者来说,ping命令是需要第一个掌握的DOS命令.它所利用的原理是这样的:网络上的机器都有唯 ...

  7. DOM 节点 课程表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. plsql部分字段中文乱码,sqlplus中文乱码

    PLSQL中文乱码 问题: 解决: 思路1:设置 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 结果:并不能解决问题!   ...

  9. ajax请求service报405错误 - 【服务器不允许的方法】

    产生原因:web服务器找不到service方法处理请求. 检查方向: ① service方法名称写错 ② service方法参数类型与标准不一致 ③ service方法异常,返回值类型和标准不一致 ④ ...

  10. 关于JavaScript日期类型处理的总结

    在任何一门开发语言中,对日期时间类型的处理,必不可少也非常重要,长期以来对于JS的日期类型处理较为苍白.在这里做一个浅显的总结. Date 对象用于处理日期和时间.Date 对象用于处理日期和时间.D ...