lua学习笔记之数据结构
使用表来实现数组,记录,列表,队列,集合
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学习笔记之数据结构相关推荐
- Lua学习笔记6:C++和Lua的相互调用
曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有. 新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项目啦,只是为什么 ...
- Lua 学习笔记(一)
Lua学习笔记 1.lua的优势 a.可扩张性 b.简单 c.高效率 d.和平台无关 2.注释 a.单行注释 -- b.多行注释 --[[ --]] 3.类型和 ...
- python的基本数据结构_Python学习笔记——基本数据结构
列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...
- 微信小程序连接物联网(二):NodeMCU Lua学习笔记
索引 这是用微信小程序遥控开门的系列文章,具体微信小程序连接物联网的代码在第三章提及. 微信小程序连接物联网(一):初始化ESP8266 NodeMCU 微信小程序连接物联网(二):NodeMCU L ...
- lua 学习笔记---游戏开发第一步
lua 学习笔记-从数组开始 数组 数组大小范围不一定需要在声明是确定,可以改变 一维数组 例 > array = {"Lua", "lualu"} &g ...
- Lua学习笔记(2)
前段时间忙于其他事,没有继续Lua的学习,现在继续我们的Lua学习吧. 首先先推荐一本书<Programming in Lua>中文版名称<Lua编程>,这本书从最基础的部分开 ...
- python的基本数据结构_python学习笔记-基本数据结构
Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...
- Lua学习笔记--table
Lua只有一种数据结构,叫table.但是他灰常强大,足以满足我们一般的要求,而且可以根据table做出其他的效果. 一.简介 table类型实际上是一种关联数组,是一种具有特殊索引方式的数组,不仅可 ...
- js array 删除指定元素_数组--学习笔记(数据结构数组 /js数组)
学习目标: 了解什么是数组: 数组如何访问内存地址(一维,二维): 什么是数组 是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储.利用元素的索引可以计算出该元素对应的存储地址. 最简 ...
最新文章
- ISE中使用Notepad++的关联设置以及Notepad++的护眼设置(设置背景色)
- git clone从远程主机克隆一个版本库
- mybatis maven 代码生成器(mysql)
- linux常用命令汇总(pwd,echo,history,nano)
- java如何用键盘输入_java中如何从键盘输入(附代码)
- leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法
- html5小游戏是用js做的吗,谁说做H5动画和游戏一定要canvas?
- Keras实现LeNet-5网络,与可视化网络
- 2017.8.10 奖励关 思考记录
- 医疗人工智能市场有多大?
- js基础知识汇总08
- 鸿蒙HMS大势渐成,P40系列开启华为终端新征程
- 中国书籍出版情况分析:2020年中国书籍出版总印数为65.2亿册(张),其中社科人文类占书籍94.8%[图]
- 正运动技术CAD导图软件配合控制器的使用方法
- ie11无法播放html,IE11无法显示flash?IE11无法播放视频的解决方法
- ThuThesis模板中\footnote每页重新从2编号的问题解决
- Qt的长期支持版本的知识搜集
- 2022~2023计算机毕业设计选题篇-选题推荐
- HTML学习(二):HTML基础
- JAVA中随机数的选取方法
热门文章
- [python]逆水行舟不进则退(1)
- [置顶] 将项目从tomcat 迁移到JBoss
- Netadvantage锁定grid列和锁定Excel栏位
- 使用OpenGL绘制圆环体(Torus)
- 上海找python工作-python上海招聘
- 零基础学python需要多久-Python要学习多久能入门?精通需要多久?
- python爬虫案例-Python爬虫案例集合
- python中国大学排名爬虫写明详细步骤-python中国大学排名爬虫
- python教程视频在线-微软再推免费在线Python教程 包含20个视频
- python画图代码彩虹-用python画一颗彩虹色爱心送给女朋友!!!