Lua 的数据结构
1. 数组与列表
1.1 数组的概念
在 Lua 中,数组是通过表(Table)实现的。数组是一种线性数据结构,元素通过整数索引访问。
1.2 数组的创建
数组可以通过直接初始化或动态添加元素来创建。
1
2
3
4
5
6
7
8
|
-- 直接初始化
local arr = {1, 2, 3, 4, 5}
-- 动态添加元素
local arr = {}
for i = 1, 5 do
arr[i] = i
end
|
1.3 数组的访问
通过索引访问数组元素,索引从 1 开始。
1
2
|
print(arr[1]) -- 输出: 1
print(arr[3]) -- 输出: 3
|
1.4 数组的遍历
使用 ipairs
或 for
循环遍历数组。
1
2
3
|
for i, v in ipairs(arr) do
print(i, v)
end
|
1.5 数组的操作
- 插入元素:使用
table.insert
。
1
2
|
table.insert(arr, 6) -- 在末尾插入
table.insert(arr, 2, 1.5) -- 在指定位置插入
|
- 删除元素:使用
table.remove
。
1
|
table.remove(arr, 2) -- 删除第二个元素
|
- 排序:使用
table.sort
。
1.6 多维数组
Lua 支持多维数组,通过嵌套表实现。
1
2
3
4
5
6
|
local matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
}
print(matrix[2][3]) -- 输出: 6
|
2. 栈与队列
2.1 栈的概念
栈是一种后进先出(LIFO)的数据结构,支持压栈(push)和弹栈(pop)操作。
2.2 栈的实现
使用表实现栈。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local stack = {}
-- 压栈
function push(value)
table.insert(stack, value)
end
-- 弹栈
function pop()
return table.remove(stack)
end
push(1)
push(2)
print(pop()) -- 输出: 2
|
2.3 队列的概念
队列是一种先进先出(FIFO)的数据结构,支持入队(enqueue)和出队(dequeue)操作。
2.4 队列的实现
使用表实现队列。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local queue = {}
-- 入队
function enqueue(value)
table.insert(queue, value)
end
-- 出队
function dequeue()
return table.remove(queue, 1)
end
enqueue(1)
enqueue(2)
print(dequeue()) -- 输出: 1
|
3. 字符串操作
3.1 字符串的基本操作
Lua 中的字符串是不可变的,所有操作都会返回一个新的字符串。
3.1.1 字符串连接
使用 ..
运算符连接字符串。
1
2
3
4
|
local str1 = "Hello"
local str2 = "Lua"
local str3 = str1 .. " " .. str2
print(str3) -- 输出: Hello Lua
|
3.1.2 字符串长度
使用 #
运算符获取字符串长度。
1
2
|
local str = "Hello"
print(#str) -- 输出: 5
|
3.1.3 字符串截取
使用 string.sub
函数截取子串。
1
2
3
|
local str = "Hello, Lua"
local sub = string.sub(str, 8, 10)
print(sub) -- 输出: Lua
|
3.2 字符串查找与替换
3.2.1 查找子串
使用 string.find
函数查找子串。
1
2
3
|
local str = "Hello, Lua"
local start, finish = string.find(str, "Lua")
print(start, finish) -- 输出: 8 10
|
3.2.2 替换子串
使用 string.gsub
函数替换子串。
1
2
3
|
local str = "Hello, Lua"
local new_str = string.gsub(str, "Lua", "World")
print(new_str) -- 输出: Hello, World
|
3.3 字符串格式化
使用 string.format
函数格式化字符串。
1
2
3
4
|
local name = "Lua"
local version = 5.4
local str = string.format("Language: %s, Version: %.1f", name, version)
print(str) -- 输出: Language: Lua, Version: 5.4
|
3.4 字符串分割
Lua 没有内置的字符串分割函数,但可以通过 string.gmatch
实现。
1
2
3
4
5
6
|
local str = "one,two,three"
local result = {}
for word in string.gmatch(str, "[^,]+") do
table.insert(result, word)
end
print(table.concat(result, " ")) -- 输出: one two three
|
3.5 字符串模式匹配
Lua 使用模式(Pattern)进行字符串匹配,类似于正则表达式。
3.5.1 常用模式
%a
:字母。
%d
:数字。
%s
:空白字符。
%w
:字母或数字。
%p
:标点符号。
3.5.2 模式匹配示例
1
2
3
4
|
local str = "Lua 5.4"
for word in string.gmatch(str, "%a+") do
print(word) -- 输出: Lua
end
|
4. 总结
Lua 的数据结构灵活而强大,通过表(Table)可以实现数组、列表、栈、队列等多种数据结构。字符串操作功能丰富,支持连接、截取、查找、替换、格式化等操作。掌握这些数据结构的使用方法,是编写高效 Lua 程序的关键。