Lua学习笔记(7)——数据结构

数组

1.使用整数来索引table即可在Lua中实现数组。因此数组没有一个固定大小。

Lua学习笔记(7)——数据结构_第1张图片
初始化数组a后,间接定义了它的大小,因为任何对字段1~1000以外的访问都会返回一个nil,而不是0

2.然而在Lua中,习惯以1作为数组的其实索引,因为Lua库和长度操作符都遵循这个约定。

通过table构造式定义数组

矩阵与多维数组

1.Lua中有两种方法表示矩阵,第一种是使用一个数组的数组,也就是嵌套table;第二种就是将两个索引合并为一个索引,即第一个索引乘以一个适当的常量(变为一维数组)。

Lua学习笔记(7)——数据结构_第2张图片
table嵌套实现一个n*m的矩阵
Lua学习笔记(7)——数据结构_第3张图片
用索引的方式创建一个n*m的矩阵

2.特殊矩阵,例如稀疏矩阵,这种矩阵中的大多数元素为0或者nil,此时无法使用长度操作符。一般使用pairs且值遍历那些非nil的元素。使用pairs的迭代并不保证会按递增的次序来访问元素。如果需要保证次序,那么就需要链表了。

Lua学习笔记(7)——数据结构_第4张图片
将矩阵的一行与一个常量相乘

链表

1.table实现链表是很方便的。每个节点以一个table来表示,一个“链接”只是一个节点table中的一个字段,该字段包含了对其他table的引用。实现一个基础的列表,其中的每个加点具有next和value两个字段,步骤如下:

先创建一个用作列表头的节点变量
在表头插入一个元素,元素值为v
Lua学习笔记(7)——数据结构_第5张图片
遍历此列表

队列与双向队列

1.实现队列的一种简单方法是使用table库中insert和remove函数,用于在一个数组的任意位置插入或删除元素,并根据操作要求移动后续元素(移动的开销大)。一种更高效的实现是使用两个索引,分别用于首尾的两个元素。

Lua学习笔记(7)——数据结构_第6张图片
队列
Lua学习笔记(7)——数据结构_第7张图片
在队列头插入元素
Lua学习笔记(7)——数据结构_第8张图片
在队列尾插入元素
Lua学习笔记(7)——数据结构_第9张图片
删除队列头的元素
Lua学习笔记(7)——数据结构_第10张图片
删除队列尾的元素

集合与无序组(bag)

1.表示集合,就是集合元素作为索引放入一个table中。那么对于任意值都无须搜索table,只需用该值来索引table并查看结果是否为nil。

Lua学习笔记(7)——数据结构_第11张图片
初始化一个集合

2.包,有时也称为多重集合(Multiset),是每个元素可以出现多次的集合。包的表示类似于集合,只不过包需要将一个计数器与table的key关联。

要插入一个元素,需要递增其计数器
若要删除一个元素,需要递减其计数器,当计数器存在或大于0时,才保留它

字符串缓冲

典型的逐行读取一个文件
Lua学习笔记(7)——数据结构_第12张图片
使用concat的逐行读取一个文件(减少性能开销)

P102

你可能感兴趣的:(Lua学习笔记(7)——数据结构)