使用表来实现数组,记录,列表,队列,集合

1、数组

索引从1开始,并且连续。此时可以使用#表名来表示数组长度。索引不是从1开始的不能使用#

local a = {}
for i = 1, 1000 doa[i] = 0
endprint(#a)输出:
1000

2、矩阵和多维数组

先创建矩阵(交错数组),然后创建行,通过这种方式可以创建三角矩阵

local N = 100
local M = 100
local mt = {}
for i = 1, N dolocal row = {}mt[i] = rowfor j = 1, M dorow[j] = 0end
end

另外一种创建矩阵的方式是使用一维数组来表示。

local N = 100
local M = 100
local mt = {}
for i = 1, N dolocal aux = (i - 1) * Mfor j = 1, M domt[aux + j] = 0endend

矩阵运算

local N = 100
local M = 100
local K = 10
local c = {}
for i = 1, M dofor j = 1, N doc[i][j] = 0for k = 1, K doc[i][j] = c[i][j] + a[i][k] * b[k][j]endend
end

矩阵运算的另外一种形式,先遍历b的行,前提是假定c的所有元素初始为0

local N = 100
local M = 100
local K = 10
local c = {}
for i = 1, M dofor k = 1, K dofor j = 1, N doc[i][j] = c[i][j] + a[i][k] * b[k][j]endend
end

使用pair计算矩阵乘法

function mult(a, b)local c = {}for i = 1, #a dolocal resultline = {}for k, va in pairs(a[i]) dofor j, vb in pairs(b[k]) dolocal res = (resultline[j] or 0) + va * vbresultline[j] = (res ~= 0) and res or nilendendc[i] = resultlineendreturn c
end

3、链表

使用表形式{next = list,value=v}

list = nillist = {next = list, value = 3}
local l = list
while l doprint(l.value)l = l.next
end输出:
3

4、队列及双端队列

使用表{first = 0,last=-1}形式表示双端队列

function listNew()return {first = 0, last = -1}
endfunction pushFirst(list, value)local first = list.first - 1list.first = firstlist[first] = value
endfunction pushLast(list, value)local last = list.last + 1list.last = lastlist[last] = value
endfunction popFirst(list)local first = list.firstif first > list.last then error("list is empty") endlocal value = list[first];list[first] = nillist.first = first + 1return value
endfunction popLast(list)local last = list.lastif list.first > last then error("list is empty") endlocal value = list[last]list[last] = nillist.last = last - 1return value
end

5、反向表

days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
revDays = {["Sunday"] = 1, ["Monday"] = 2, ["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5,["Friday"] = 6, ["Saturday"] = 7}
x = "Tuesday"
print(revDays[x])输出:
3

也可以直接通过映射表来构建反向表

days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
revDays = {}
for k, v in pairs(days) dorevDays[v] = k
end
x = "Tuesday"
print(revDays[x])

6、集合

在表中将集合中的元素作为索引。

reserved = {["while"] = true, ["if"] = true,["else"] = true, ["do"] = true
}s = "while ok"
for w in string.gmatch(s, "[%a_][%w_]*") doif not reserved[w] thenprint(w)end
end输出:
ok

可以通过列表构造集合

function Set(list)local set = {}for _, l in ipairs(list) doset[l] = trueendreturn set
end

多重结合即multiset

function insert(bag, element)bag[element] = (bag[element] or 0) + 1
endfunction remove(bag, element)local count = bag[element]bag[element] = (count and count > 1) and count - 1 or nil
end

7、字符串缓存

在存在多个字符串时,直接使用..拼接符,会影响性能。可以考虑使用表来存放字符串,通过table.concat来拼接字符串。

local t = {}for line in io.lines() dot[#t + 1] = line .. "\n"
endlocal s = table.concat(t)

8、图

表中包含两个字段,name表示结点名,adj表示邻接结点

local function name2node(graph, name)local node = graph[name]if not node thennode = {name = name, adj = {}}graph[name] = nodeendreturn node
end---从文件中读取图
function readgraph()local graph = {}for line in io.lines() dolocal namefrom, nameto = string.match(line, "(%S+"%s+(%S+))local from = name2node(graph, namefrom)local to = name2node(graph, nameto)from.adj[to] = trueendreturn graph
endfunction findpath(curr, to, path, visited)path = path or {}visited = visited or {}if visited[curr] thenreturn nilendvisited[curr] = truepath[#path + 1] = currif curr == to thenreturn pathendfor node in pairs(curr.adj) dolocal p = findpath(node, to, path, visited)if p thenreturn pendendtable.remove(path)
end

lua学习笔记之数据结构相关推荐

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

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

  2. Lua 学习笔记(一)

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

  3. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  4. 微信小程序连接物联网(二):NodeMCU Lua学习笔记

    索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...

  5. lua 学习笔记---游戏开发第一步

    lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...

  6. Lua学习笔记(2)

    前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...

  7. python的基本数据结构_python学习笔记-基本数据结构

    Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...

  8. Lua学习笔记--table

    Lua只有一种数据结构,叫table.但是他灰常强大,足以满足我们一般的要求,而且可以根据table做出其他的效果. 一.简介 table类型实际上是一种关联数组,是一种具有特殊索引方式的数组,不仅可 ...

  9. js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)

    学习目标: 了解什么是数组: 数组如何访问内存地址(一维,二维): 什么是数组 是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储.利用元素的索引可以计算出该元素对应的存储地址. 最简 ...

最新文章

  1. ISE中使用Notepad++的关联设置以及Notepad++的护眼设置(设置背景色)
  2. git clone从远程主机克隆一个版本库
  3. mybatis maven 代码生成器(mysql)
  4. linux常用命令汇总(pwd,echo,history,nano)
  5. java如何用键盘输入_java中如何从键盘输入(附代码)
  6. leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法
  7. html5小游戏是用js做的吗,谁说做H5动画和游戏一定要canvas?
  8. Keras实现LeNet-5网络,与可视化网络
  9. 2017.8.10 奖励关 思考记录
  10. 医疗人工智能市场有多大?
  11. js基础知识汇总08
  12. 鸿蒙HMS大势渐成,P40系列开启华为终端新征程
  13. 中国书籍出版情况分析:2020年中国书籍出版总印数为65.2亿册(张),其中社科人文类占书籍94.8%[图]
  14. 正运动技术CAD导图软件配合控制器的使用方法
  15. ie11无法播放html,IE11无法显示flash?IE11无法播放视频的解决方法
  16. ThuThesis模板中\footnote每页重新从2编号的问题解决
  17. Qt的长期支持版本的知识搜集
  18. 2022~2023计算机毕业设计选题篇-选题推荐
  19. HTML学习(二):HTML基础
  20. JAVA中随机数的选取方法

热门文章

  1. [python]逆水行舟不进则退(1)
  2. [置顶] 将项目从tomcat 迁移到JBoss
  3. Netadvantage锁定grid列和锁定Excel栏位
  4. 使用OpenGL绘制圆环体(Torus)
  5. 上海找python工作-python上海招聘
  6. 零基础学python需要多久-Python要学习多久能入门?精通需要多久?
  7. python爬虫案例-Python爬虫案例集合
  8. python中国大学排名爬虫写明详细步骤-python中国大学排名爬虫
  9. python教程视频在线-微软再推免费在线Python教程 包含20个视频
  10. python画图代码彩虹-用python画一颗彩虹色爱心送给女朋友!!!