Lua学习笔记之数据结构

最近研究Lua,顺便写点笔记吧!数据结构是没有语言之分的,只不过不同的语言实现起来的语法不同,既然是Lua菜鸟,就来实现几个常用的数据结构来练练语法吧!首先是作为数据结构基石的数组,在Lua中数组是用表来实现的,表是个强大的东西,能表示太多东西了,当表中元素的下标都是整数的时候,我们把这个表称作数组。数组的大小不固定,可以动态的增长。

代码如下:

--创建一个简单的数组
local arr1 = {1,2,3,4,5,6}
--遍历数组中得每一个元素
for i,v in ipairs(arr1) do
print(v)
end

--另一种创建数组的方式
local arr2 = {}
for i=1,10 do
arr2[i] = i
print(arr2[i])
end

--创建数组,下标从2开始
local arr2 = {[2]="hello",[3]="xiao",[4]="ta",[5]="zaojiahua"}
--使用迭代器ipairs遍历的时候输出为空值,因为arr2[1]=nil当ipairs遇到空值的时候就返回了
for i,v in ipairs(arr2) do
print(i,v)
end
--这个时候需要使用pairs遍历
for i,v in pairs(arr2) do
print(i,v)
end

创建数组的时候整数下标最好从1开始,因为这个值是Lua中默认开始的下标,这和其他语言的下标从零开始有点区别,如果你采用其他的数字下标开始,使用某些Lua库的时候可能不能获得预期的结果。然后就是遍历数组的方式,我们用到了迭代器ipairs()和pairs(),这个使用时候的区别代码已经有体现了,ipairs中得i代表的就是整数下标,从1开始。

有一维数组当然就有多维的,下面来创建一个二维数组,也就是矩阵,其他的类推吧。

代码如下:

--创建一个10*5的二维数组
local int_arr = {}

for i=1,10 do
    int_arr[i] = {}
    for j=1,5 do
        int_arr[i][j] = j
    end
end

--遍历二维数组
for i,v in ipairs(int_arr) do
    for j,k in ipairs(v) do
        io.write(k.."\t")
    end
    print("\n")
end

接下来实现一个链表,链表的每个节点用一个table表示,table中的字段包括指向下一个节点的指针和该节点的数据元素,这里只是提供一个思路,其他的东西可以用的时候扩展。

代码如下:

--实现一个链表
local list = nil
--链表元素包含俩个字段,next代表的是指针,指向下一个链表元素,value代表的是该链表元素的值
for i=1,10 do
    list = {next = list,value = i}
end

--链表的遍历
local l = list
while l do
    print(l.value)
    l = l.next
end

接下来实现一个比较有用的数据结构——队列。我把队列封装在了一个table表中,关于队列的操作和表示队列头和队列尾的指针也封装在了一起。当对头等于队尾的时候表示没有元素,而这个队列是可以无限增大的,并没有队列满的限制,大家可以根据自己的需要进行扩展。

代码如下:

--实现一个队列 包括头指针first和尾指针last first==last的时候代表队列为空
local Que = {first=0,last=0}

--向队列中添加元素,last索引指向最后一个元素的下一个元素,first索引指向的是第一个元素
function Que:push(value)
    local last = self.last
    self[last] = value
    self.last = last+1
end
--移除元素,队列的特点是先进先出
function Que:pop()
    if self.first == self.last then
        print("队列空")
        return nil
    end
    local first = self.first
    self.first = first+1
    return self[first]
end

--显示队列中得元素
function Que:showValue()
    for i=self.first,self.last-1 do
        print("value:"..self[i])
    end
end

--测试
print("队列测试")
Que:showValue()
Que:push(2)
Que:push(3)
print("push 2,3")
Que:showValue()
Que:push(3)
print("push 3")
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("push 100")
Que:push(100)
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())

(0)

相关推荐

  • Lua中的table学习笔记

    table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组.记录.线性表.队列.集合等数据结构都可以用 table 来表示,甚至连全局变量(_G).模块.元表(metatable)等这些重要的 Lua 元素都是 table 的结构.可以说,table  是一个强大而又神奇的东西. table 特性 在之前介绍 Lua 数据类型时,也说过了 table 的一些特性,简单列举如下(详情可查看之前的介绍): 1.table是一个"关联数组",数组的索引可以是数字

  • Lua学习笔记之表和函数

    Lua中的表和函数比较重要,正是因为二者的结合才完成了很多很多的功能,Lua才变得如此的强大,所以有必要仔细的学习一下表和函数.如下的代码体现了表的用法. --表 --可以使用构造器来初始化表,表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表. local days = {"xiao", "ta", "hello", "lua"} --第一个元素索引为1,以后的类推,这一点和其他语言的第一个元素索引是0

  • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记

    赋值语句 注释,单行用(--)来表示:多行用(--[[ ... ]])来标示: 定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的. 赋值,是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量.a, b = 10, 2*x <--> a=10; b=2*x 遇到赋值语句Lua会先计算右边所有的

  • Lua入门学习笔记

    最近在使用Cocos2d-x + Lua来开发游戏. 游戏的主要逻辑将在Lua里写,之前没有接触过Lua,以下是我总结的入门笔记. 运算符 逻辑运算符 与:and 或:or 非:not 逻辑判断只有在false和nil时为假,其余均为真. or和and会返回第一个断路的值. Lua中没有C语言的三元符(x ? a : b),但有一个替代方案(x and a) or b. 需要注意的是,以上方案在x为true,a为false,b为true的情况下与三元符的结果是相反的. 关系运算符 不等于:~=

  • Lua学习笔记之运算符和表达式

    本篇博客学习一下Lua的运算符,比较简单,我将说明直接写到了代码中,代码如下. --算术运算符 --二元运算符:+ - * / ^ (加减乘除幂) --一元运算符:- (负值) --这些运算符的操作数都是实数,Lua中没有自增自减的运算符. --关系运算符 -- < > <= >= == ~= --这里需要注意的是不等于是用~=表示的 --这些操作符返回结果为false或者true:==和~=比较两个值,如果两个值类型不同,Lua认为两者不同: --nil只和自己相等.Lua通过引

  • Lua 学习笔记之C API 遍历 Table实现代码

    Lua 通过一个虚拟栈与 C 的交互,正数索引自底向上取值,负数索引自顶向下取值. Lua 中的 Table(表)结构可以使用任何数据作为 key 进行取值.使用 C API 访问 Table 中的元素有两种方法: 复制代码 代码如下: lua_getglobal(L, t); lua_pushinteger(L, k); -- 这里可以换成其它类型的 lua_pushXXXX(L, k) 压数据到栈顶作key lua_gettable(L, -2); lua_getglobal(L, t);

  • Lua学习笔记之表达式

    前言 这里总结的内容和其它语言的基本类似,所以这里就只是基本的进行总结.不做详细的讲解. 算术操作符 Lua支持常规的算术操作符有:"+"(加法),"-"(减法),"*"(乘法),"/"(除法),"^"(指数),"%"(取模),一元的"-"(负号).所有的这些操作符都用于实数.例如:x^0.5将计算x的平方根,x^3将计算x的3次方. 关系操作符 Lua提供的关系操作

  • Lua学习笔记之数据类型

    从本篇博客开始研究一下Lua,现在的Lua真得是很火,因为Cocos2d-x写游戏的时候会用到,所以就拿过来学学吧,先从基础的语法开始,然后慢慢的深入.本人也是刚刚学习,希望和学习Lua的大家交流,博客权当笔记,有错误之处还请赐教. 当然首先是开发环境了,我的学习背景是Cocos2d-x,所以下载了最近发布的Cocos Code IDE版本,我们可以在Cocos Code IDE上边新建工程,然后写Lua测试代码,关于Cocos Code IDE的使用官方有不少的教程,这里就不说了.当然你也可以

  • Lua学习笔记之数据结构

    最近研究Lua,顺便写点笔记吧!数据结构是没有语言之分的,只不过不同的语言实现起来的语法不同,既然是Lua菜鸟,就来实现几个常用的数据结构来练练语法吧!首先是作为数据结构基石的数组,在Lua中数组是用表来实现的,表是个强大的东西,能表示太多东西了,当表中元素的下标都是整数的时候,我们把这个表称作数组.数组的大小不固定,可以动态的增长. 复制代码 代码如下: --创建一个简单的数组 local arr1 = {1,2,3,4,5,6} --遍历数组中得每一个元素 for i,v in ipairs

  • Python学习笔记基本数据结构之序列类型list tuple range用法分析

    本文实例讲述了Python学习笔记基本数据结构之序列类型list tuple range用法.分享给大家供大家参考,具体如下: list 和 tuple list:列表,由 [] 标识: 有序:可改变列表元素 tuple:元组,由 () 标识: 有序:不可改变元组元素(和list的主要区别) list 和 tuple 的创建: print([]) # 空list print(["a",1,True]) # 元素类型不限 print([x for x in range(0,6)]) #

  • Lua学习笔记之类型与值

    基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: local iValue = 10

  • Lua学习笔记之函数、变长参数、closure(闭包)、select等

    1. Lua函数支持多返回值,但并不是每次调用函数返回的全部值都会被使用. 有一条规则是只有当函数调用是表达式最后一个元素时,才会使用它的全部返回值.看代码: 复制代码 代码如下: --string.find函数返回两个值,:被查找子串的开始索引和结束索引  s,e = string.find("Lua program language","Lua")  print(s,e)  --> 1    3    --如果找不到,则输出nil和nil  s,e = s

  • ES6学习笔记之Set和Map数据结构详解

    本文实例讲述了ES6学习笔记之Set和Map数据结构.分享给大家供大家参考,具体如下: 一.Set ES6提供了新的数据结构Set.类似于数组,只不过其成员值都是唯一的,没有重复的值. Set本身是一个构造函数,用来生成Set数据结构. 1 . Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. var s = new Set(); var set = new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4] var items =

随机推荐