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

 更新时间:2014年09月27日 15:27:39   作者:Mr.Ant  
这篇文章主要介绍了Lua中使用table实现的其它5种数据结构,本文用table为基础,实现了数组、链表、队列、集合等数据类型,需要的朋友可以参考下

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

1、数组

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

复制代码 代码如下:

--二维数组
n=10 m=10
arr={}
for i=1,n do
     arr[i]={}
   for j=1,m do
      arr[i][j]=i*j
   end
end

for i=1, n do
   for j=1, 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 = 1, 10 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=0, last=-1}
end

function List.pushFront(list,value)
   list.first=list.first-1
   list[ list.first ]=value
end

function List.pushBack(list,value)
   list.last=list.last+1
   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+1
   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-1
   return value
end

lp=List.new()
List.pushFront(lp,1)
List.pushFront(lp,2)
List.pushBack(lp,-1)
List.pushBack(lp,-2)
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
-- -2
-- 1
-- -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 0)+1
end

function remove(Bag,element)
   local count=Bag[element]
   if count >0 then Bag[element]=count-1
   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+1]=line
end

local s=table.concat(t,"\n")  --将table t 中的字符串连接起来

相关文章

  • 使用Lua编写Nginx服务器的认证模块的方法

    使用Lua编写Nginx服务器的认证模块的方法

    这篇文章主要介绍了使用Lua编写Nginx服务器的认证模块的方法,即诸如当今流行的社交应用接入等功能,需要的朋友可以参考下
    2015-06-06
  • Lua中的loadfile、dofile、require详解

    Lua中的loadfile、dofile、require详解

    这篇文章主要介绍了Lua中的loadfile、dofile、require详解,本文分别用实例讲解它的用法和特点等内容,需要的朋友可以参考下
    2014-09-09
  • Lua基础之运算符的使用示例

    Lua基础之运算符的使用示例

    今天小编就为大家分享一篇关于Lua基础之运算符的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Lua教程(十九):C调用Lua

    Lua教程(十九):C调用Lua

    这篇文章主要介绍了Lua教程(十九):C调用Lua,本文讲解了C调用Lua基础知识、table操作、调用Lua函数等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中使用table.concat连接大量字符串实例

    Lua中使用table.concat连接大量字符串实例

    这篇文章主要介绍了Lua中使用table.concat连接大量字符串实例,本文是Lua处理大量字符串的一个测试文章,测试了2种方法处理大量字符串的消耗时间,需要的朋友可以参考下
    2014-09-09
  • Lua数据类型介绍

    Lua数据类型介绍

    这篇文章主要介绍了Lua数据类型介绍,本文讲解了Lua中的nil(空)、boolean(布尔)、number(数字)、string(字符串)、table(表)、function(函数)、thread(线程)、userdata(自定义类型)等数据类型,需要的朋友可以参考下
    2014-12-12
  • Lua Table转C# Dictionary的方法示例

    Lua Table转C# Dictionary的方法示例

    这篇文章主要给大家介绍了关于Lua Table转C# Dictionary的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Lua教程(二):C++和Lua相互传递数据示例

    Lua教程(二):C++和Lua相互传递数据示例

    这篇文章主要介绍了Lua教程(二):C++和Lua相互传递数据示例,本文主要讲解了基本数据类型的传递,比如整形(int)、字符串(string)、数字(number)及bool值,需要的朋友可以参考下
    2014-09-09
  • Lua中编译执行代码相关的函数详解

    Lua中编译执行代码相关的函数详解

    这篇文章主要介绍了Lua中编译执行代码相关的函数详解的相关资料,需要的朋友可以参考下
    2015-04-04
  • 把Lua函数传递到C/C++中实例

    把Lua函数传递到C/C++中实例

    这篇文章主要介绍了把Lua函数传递到C/C++中实例,本文先是分析了需求,然后给出解决方法,需要的朋友可以参考下
    2014-11-11

最新评论