《Lua程序设计》--学习7

news2025/1/31 17:58:37

数据结构

数组

矩阵和多维数组

不规则数组:数组的数组,也就是所有元素均是另一个表的表

 将两个索引合并为一个:声明一个长数组,然后根据 行数*行所拥有的元素个数+列数来访问这样

 链表

因为表是动态对象,所以在Lua语言中可以很容易地实现链表

可以把每个节点用一个表来表示,链接则为一个包含指向其他表地引用的简单表字段

单链表:每个结点包含两个字value和next,如下代码在表头插入了一个值为v的元素

遍历链表:

 队列及双端队列

使用table标准库中的函数 insert 和 remove,更高效的使用两个索引,一个指向第一个元素,一个指向最后一个元素

示例一个双端队列:

---[==[
function listNew(  )
  return {first = 0,last = -1}
end

function pushFirst( list,value )
	local first = list.fist - 1 
    last.first = first
    list[first] = value
end

function pushLast( list,value )
	local last = list.last + 1
    list.last = last
    list[last] = value
end

function popFirst( 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 popLast( list )
	local last = list.last
    if list.first > last then error("list is empty") end
    local value = list[last]
    list[last] = nillist.last = lsat - 10return value
end

--]==]

 反向表

 构造反向表

 集合与包

假设我们想列出一个程序源代码中的所有标识符,同时过滤掉其中的保留字。一些C程序员可能倾向于使用字符串数组来表示保留字集合,然后搜索这个数组来决定某个单词是否属于该集合。为了提高搜索的速度,他们还可能会使用二叉树来表示该集合。

在Lua语言中,还可以用一种高效且简单的方式来表示这类集合,即将集合元素作为索引放入表中。那么,对于指定的元素无须再搜索表,只需用该元素检索表并检查结果是否为nil即可。以上述需求为例,代码形如:

 我们可以借助一个辅助函数来构造集合,使得初始化过程更清晰:

 包(bag),也被称为多重集合(multiset),与普通集合的不同之处在于其中的元素可以出现多次。在Lua语言中,包的简单表示类似于此前集合的表示,只不过其中的每一个键都有一个对应的计数器。如果要插入一个元素,可以递增其计数器:

 如果要删除一个元素,可以递减其计数器:

 只有当计数器存在且大于0时我们才会保留计数器。

字符串缓冲区

假设我们正在开发一段处理字符串的程序,比如逐行地读取一个文件。典型的代码可能形如

这种的运行起来非常慢,因为每读一行就需要重新写一个buff,将所有数据复制过去

推荐方式:

 我们可以把一个表当作字符串缓冲区,其关键是使用函数table.concat,这个函数会将指定列表中的所有字符串连接起来并返回连接后的结果

图形

使用对象来表示节点(实际上是表)、将边(arc)表示为节点之间的引用。

我们使用一个由两个字段组成的表来表示每个节点,即name(节点的名称)和adj(与此节点邻接的节点的集合)。由于我们会从一个文本文件中加载图对应的数据,所以需要能够根据节点的名称来寻找指定节点的方法。因此,我们使用了一个额外的表来建立节点和节点名称之间的映射。函数name2node可以根据指定节点的名称返回对应的节点:

 

 该函数逐行地读取一个文件,文件的每一行中有两个节点的名称,表示从第1个节点到第2个节点有一条边。对于每一行,调用函数string.match将一行中的两个节点的名称分开,然后根据名称找到对应的节点(如果需要的话则创建节点),最后将这些节点连接在一起。

寻找两个节点之间的路径的算法

 函数findpath使用深度优先遍历搜索两个节点之间的路径。该函数的第1个参数是当前节点,第2个参数是目标节点,第3个参数用于保存从起点到当前节点的路径,最后一个参数为所有已被访问节点的集合(用于避免回路)

数据文件和序列化

数据文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/631628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.7 wait notify - 4.11 多把锁

目录 4.7 wait notify1、为什么需要wait2、原理之wait/notify3、API的介绍 4.8 wait notify 的正确姿势4.9 Park & Unpark4.10 重新理解线程状态转换4.11 多把锁 4.7 wait notify 1、为什么需要wait 当持有锁的线程因为某种条件不能满足不能执行时,由于其持有…

usb的传输类型

usb的传输类型 usb的四种传输类型: 批量传输同步传输(或等时传输)中断传输控制传输 其中的批量,同步,中断,三种传输中,每完整传输一次数据都称做一个事务(主要的数据传输是靠这三种传输) 事务的具体表现(批量,同步,中断) ​ 上图说说的输入事务是以主机来说的, 主机需要先发…

EMC学习笔记(三)滤波

滤波 1.概述2.滤波器件2.1 电阻2.2 电感2.3 电容2.4 铁氧体磁珠2.5 共模电感 3.滤波电路3.1 滤波电路的形式3.2 滤波电路的布局与布线 4.电容在PCB的EMC设计中的应用4.1 滤波电容的种类4.2 电容自谐振问题4.3 ESR对并联电容幅频特性的影响4.4 ESL对并联电容幅频特性的影响4.5 电…

JVM原理:JVM运行时内存模型(通俗易懂)

目录 前言正文虚拟机栈局部变量表操作数栈动态链接方法返回地址 本地方法栈本地方法存在的意义本地方法的调用 虚拟机堆堆结构Eden区Survivor区域老年代Old区常用参数指令 方法区常量池 运行时常量池方法信息类信息域信息JDK1.7前的方法区JDK1.7时的方法区JDK1.7后的方法区 程序…

Spring-2

DI 依赖注入 所谓依赖注入&#xff0c;是指程序运行过程中&#xff0c;如果需要调用另一个对象协助时&#xff0c;无须在代码中创建被调用者&#xff0c;而是依赖于外部的注入<bean id”” class”” p:属性名称-ref”另外受管 bean 的名称”/> IoC 实际上有 2 种实现 …

探索Python工具库合集:提高开发效率的秘密武器

前言&#x1f680;&#x1f680; 在开发过程中&#xff0c;笔者积累了许多实用的Python工具函数和模块&#xff0c;决定将它们整理成一个工具库集合&#xff0c;并与大家分享。本文将介绍笔者的Python工具库集合的核心功能和用途&#xff0c; 在日常的Python开发中&#xff0c;…

Selenium Python教程第6章:使用页面对象

6. Page Objects 页面对象 6.1 什么是页面对象模型(POM)&#xff1f; 页面对象模型(Page Objects Model, POM )是一组旨在表示一个或多个网页的类, 用1个类来保存1个网页上所有的元素&#xff0c;相似的网页可以重用此类。 1个网站通常有多个页面&#xff0c;可以用多个页面类…

(opencv)图像几何变换——缩放

图像缩放是指将图像的尺寸变小或变大的过程&#xff0c;也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失&#xff0c;因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩…

多线程目录

基础概念篇 001线程状态图示_存在,及合理的博客-CSDN博客例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。提示&#xff1a;以下是本篇文章正文内容&…

机器学习 day16(前向传播算法,Tensorflow的实现代码)

1. 手写数字识别的神经网络模型 为简单起见&#xff0c;仅区分手写0和1&#xff0c;并用8*8的像素矩阵&#xff0c;共有64个像素&#xff08;特征&#xff09;&#xff0c;展开写成向量x&#xff0c;即该神经网络模型的输入特征向量x的维数为64&#xff0c;设该模型有两层隐藏…

一文打通:从字节码指令的角度解读前置后置自增自减(加加++减减--)

文章目录 1.前置了解的知识1.1 栈这种数据结构1.2 局部变量表和操作数栈1.3 三个字节码指令 2.单独使用后置与前置2.1 后置字节码指令2.2 前置字节码指令2.3 总结 3.需要返回值的情况下使用后置与前置3.1 后置字节码指令3.2 前置字节码指令3.3 总结3.4 练习&#x1f340; 练习一…

npm i安装依赖包报错proxy‘ config is set properly. See: ‘npm help config‘

npm i 报错proxy‘ config is set properly. See: ‘npm help config‘ 网上搜了解决方法&#xff1a; https://blog.csdn.net/zz00008888/article/details/127852233 但是执行完还是报错&#xff0c;查代理已经是false了 看到是cnpm镜像&#xff0c;于是用cnpm i 就运行成功…

设计模式篇---原型模式

文章目录 概念Java中的克隆方法实例使用场景 概念 定义&#xff1a;使用原型实例指定待创建对象的类型&#xff0c;并通过复制这个原型来创建新的对象。 原型模式主要有以下几部分组成&#xff1a; Prototype(抽象原型类):具体原型类的接口或者抽象类。 ConcretePrototype(具体…

Mybatis 全系列目录引导(持续更新)

基础篇 001Mybatis常用的网站及工具_存在,及合理的博客-CSDN博客GITHUB。https://blog.csdn.net/qq_26594041/article/details/131098123002Mybatis初始化引入_存在,及合理的博客-CSDN博客自动检测工程中的DataSource创建并注册SqlSessionFactory实例创建并注册SqlSessionTemp…

OpenGL光照之颜色

文章目录 创建一个光照场景 现实世界中有无数种颜色&#xff0c;每一个物体都有它们自己的颜色。我们需要使用&#xff08;有限的&#xff09;数值来模拟真实世界中&#xff08;无限&#xff09;的颜色&#xff0c;所以并不是所有现实世界中的颜色都可以用数值来表示的。然而我…

物联网Lora模块从入门到精通(四)对某些端口的初始化

一、前言 由于程序设计开发具有的不确定性&#xff0c;我们常常需要初始化某些特定的引脚&#xff0c;并读取引脚电平状态或向引脚输出高低电平。 二、代码实现 快速找到端口的初始化语句&#xff1a; 首先&#xff0c;找到board.c文件&#xff0c;在下图的位置&#xff0c;我…

【算法系列专栏介绍】

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 决定开一个算法专栏&#xff0c;希望能帮助大…

什么是域控服务器?域控服务器功能?部署域控需要考虑因素?域控组策略功能?

一、什么是域控制服务器&#xff1f; 域控制器&#xff08;Domain Controller&#xff09;是在Windows Server操作系统上运行的一个服务角色&#xff0c;它用于管理和控制一个或多个计算机的安全策略、用户身份验证和授权等任务。域控制器通常是用于企业网络中的主要身份验证和…

性能测试从0到1实战,超详细性能测试计划编写汇总...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试背景 首先…

yt-dlp 使用教程

参考&#xff1a;yt-dlp 使用教程 下载yt-dlp.exe&#xff0c;地址&#xff1a;Releases yt-dlp/yt-dlp GitHub windows下载.exe版本&#xff0c;放到指定路径下&#xff0c;我的是C:\Users\bellychang\Downloads 查看视频所有分辨率 yt-dlp.exe --proxy socks5://127.0.0.…