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 matrixfor i=1,N domt[i] = {} -- 注意别丢了这句,创建rowfor j=1,M domt[i][j] = 0endend---------------链表---------------list = { next = list, value = v}local l = listwhile l doprint(l.value)l = l.nextend---------------队列---------------List = {}function List.new ()return {first = 0, --保存队首索引last = -1, --保存堆尾索引...... -- 队列元素以数组下标索引}endfunction List.pushleft (list, value) -- 队首插入local first = list.first - 1list.first = firstlist[first] = valueendfunction List.pushright (list, value) --堆尾插入local last = list.last + 1list.last = lastlist[last] = valueendfunction List.popleft (list) --队首删除local first = list.firstif first > list.last then error("list is empty") endlocal value = list[first]list[first] = nil -- to allow garbage collectionlist.first = first + 1return valueendfunction List.popright (list) -- 堆尾删除local last = list.lastif list.first > last then error("list is empty") endlocal value = list[last]list[last] = nil -- to allow garbage collectionlist.last = last - 1return valueend---------------集合和包-----------------以元素值为数组下标,完美实现local function Set (list) --通过数组list构建集合Setlocal set = {}for _, l in ipairs(list) do set[l] = true endreturn setendlocal reserved = Set{"while", "end", "function", "local", }for w in allwords() doif reserved[w] then-- `w' is a reserved wordend---------------字符串缓冲区---------------local buff = ""for line in io.lines() dobuff = 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 doif string.len(stack[i]) > string.len(stack[i+1]) then --栈顶是否下一层长?--栈顶没有比下一层长,则不与下一层合并breakend-- 栈顶比下一层长,要把栈顶合并到下一层--删除栈顶,栈顶和下一层合并层更大的串,此时下一层边栈顶stack[i] = stack[i] .. table.remove(stack)--合成了新的栈顶之后,要再往下检查是否有更长的串,不然继续重复上面的合并endendlocal s = newStack()for line in io.lines() doaddString(s, line .. "\n")ends = toString(s)---------------table.concat-----------------底层是C实现,所以性能优异local t = {}for line in io.lines() dotable.insert(t, line)ends = table.concat(t, "\n") .. "\n" -- 将数组t的全部元素以\n作为连接符,连接起来。-- 最后一个元素尾部不会有连接符,下面的技巧完美解决table.insert(t, "") --解决最后一个元素尾部没有换行符的问题。s = table.concat(t, "\n")
