table,唯一数据结构,其他都是用table实现。
a = {} -- 数组,注意!下标最好从1开始,因为库都是1开始。
for i = 1, 1000 do a[i] = 0 end
---------------表构造---------------
polyline = {
color="blue", --polyline.color或者polyline["polyline"]
thickness=2; --可以用分号
npoints=4,
{x=0, y=0}, --polyline[1]
{x=-10, y=0}, --polyline[2]
{x=-10, y=1}, --polyline[3]
{x=0, y=1}, --polyline[4]
["+"] = "add", --polyline["+"]
["-"] = "sub",
["*"] = "mul",
["/"] = "div"
}
---------------矩阵、多维数组---------------
mt = {} -- create the matrix
for i=1,N do
mt[i] = {} -- 注意别丢了这句,创建row
for j=1,M do
mt[i][j] = 0
end
end
---------------链表---------------
list = { next = list, value = v}
local l = list
while l do
print(l.value)
l = l.next
end
---------------队列---------------
List = {}
function List.new ()
return {
first = 0, --保存队首索引
last = -1, --保存堆尾索引
...... -- 队列元素以数组下标索引
}
end
function List.pushleft (list, value) -- 队首插入
local first = list.first - 1
list.first = first
list[first] = value
end
function List.pushright (list, value) --堆尾插入
local last = list.last + 1
list.last = last
list[last] = value
end
function List.popleft (list) --队首删除
local first = list.first
if first > list.last then error("list is empty") end
local value = list[first]
list[first] = nil -- to allow garbage collection
list.first = first + 1
return value
end
function List.popright (list) -- 堆尾删除
local last = list.last
if list.first > last then error("list is empty") end
local value = list[last]
list[last] = nil -- to allow garbage collection
list.last = last - 1
return value
end
---------------集合和包---------------
--以元素值为数组下标,完美实现
local function Set (list) --通过数组list构建集合Set
local set = {}
for _, l in ipairs(list) do set[l] = true end
return set
end
local reserved = Set{"while", "end", "function", "local", }
for w in allwords() do
if reserved[w] then
-- `w' is a reserved word
end
---------------字符串缓冲区---------------
local buff = ""
for line in io.lines() do
buff = buff .. line .. "\n" --性能极低,每个连接符都要生成开辟一块新的内存
end
--如何解决上面的性能问题?
function newStack ()
return {
"" --[0]空串,栈底
}
end
-- io.read("*all")就是类似这种原理
function addString (stack, s)
table.insert(stack, s) -- 压栈
for i = table.getn(stack) - 1, 1, -1 do
if string.len(stack[i]) > string.len(stack[i+1]) then --栈顶是否下一层长?
--栈顶没有比下一层长,则不与下一层合并
break
end
-- 栈顶比下一层长,要把栈顶合并到下一层
--删除栈顶,栈顶和下一层合并层更大的串,此时下一层边栈顶
stack[i] = stack[i] .. table.remove(stack)
--合成了新的栈顶之后,要再往下检查是否有更长的串,不然继续重复上面的合并
end
end
local s = newStack()
for line in io.lines() do
addString(s, line .. "\n")
end
s = toString(s)
---------------table.concat---------------
--底层是C实现,所以性能优异
local t = {}
for line in io.lines() do
table.insert(t, line)
end
s = table.concat(t, "\n") .. "\n" -- 将数组t的全部元素以\n作为连接符,连接起来。
-- 最后一个元素尾部不会有连接符,下面的技巧完美解决
table.insert(t, "") --解决最后一个元素尾部没有换行符的问题。
s = table.concat(t, "\n")