table,唯一数据结构,其他都是用table实现。

    1. a = {} -- 数组,注意!下标最好从1开始,因为库都是1开始。
    2. for i = 1, 1000 do a[i] = 0 end
    3. ---------------表构造---------------
    4. polyline = {
    5. color="blue", --polyline.color或者polyline["polyline"]
    6. thickness=2; --可以用分号
    7. npoints=4,
    8. {x=0, y=0}, --polyline[1]
    9. {x=-10, y=0}, --polyline[2]
    10. {x=-10, y=1}, --polyline[3]
    11. {x=0, y=1}, --polyline[4]
    12. ["+"] = "add", --polyline["+"]
    13. ["-"] = "sub",
    14. ["*"] = "mul",
    15. ["/"] = "div"
    16. }
    17. ---------------矩阵、多维数组---------------
    18. mt = {} -- create the matrix
    19. for i=1,N do
    20. mt[i] = {} -- 注意别丢了这句,创建row
    21. for j=1,M do
    22. mt[i][j] = 0
    23. end
    24. end
    25. ---------------链表---------------
    26. list = { next = list, value = v}
    27. local l = list
    28. while l do
    29. print(l.value)
    30. l = l.next
    31. end
    32. ---------------队列---------------
    33. List = {}
    34. function List.new ()
    35. return {
    36. first = 0, --保存队首索引
    37. last = -1, --保存堆尾索引
    38. ...... -- 队列元素以数组下标索引
    39. }
    40. end
    41. function List.pushleft (list, value) -- 队首插入
    42. local first = list.first - 1
    43. list.first = first
    44. list[first] = value
    45. end
    46. function List.pushright (list, value) --堆尾插入
    47. local last = list.last + 1
    48. list.last = last
    49. list[last] = value
    50. end
    51. function List.popleft (list) --队首删除
    52. local first = list.first
    53. if first > list.last then error("list is empty") end
    54. local value = list[first]
    55. list[first] = nil -- to allow garbage collection
    56. list.first = first + 1
    57. return value
    58. end
    59. function List.popright (list) -- 堆尾删除
    60. local last = list.last
    61. if list.first > last then error("list is empty") end
    62. local value = list[last]
    63. list[last] = nil -- to allow garbage collection
    64. list.last = last - 1
    65. return value
    66. end
    67. ---------------集合和包---------------
    68. --以元素值为数组下标,完美实现
    69. local function Set (list) --通过数组list构建集合Set
    70. local set = {}
    71. for _, l in ipairs(list) do set[l] = true end
    72. return set
    73. end
    74. local reserved = Set{"while", "end", "function", "local", }
    75. for w in allwords() do
    76. if reserved[w] then
    77. -- `w' is a reserved word
    78. end
    79. ---------------字符串缓冲区---------------
    80. local buff = ""
    81. for line in io.lines() do
    82. buff = buff .. line .. "\n" --性能极低,每个连接符都要生成开辟一块新的内存
    83. end
    84. --如何解决上面的性能问题?
    85. function newStack ()
    86. return {
    87. "" --[0]空串,栈底
    88. }
    89. end
    90. -- io.read("*all")就是类似这种原理
    91. function addString (stack, s)
    92. table.insert(stack, s) -- 压栈
    93. for i = table.getn(stack) - 1, 1, -1 do
    94. if string.len(stack[i]) > string.len(stack[i+1]) then --栈顶是否下一层长?
    95. --栈顶没有比下一层长,则不与下一层合并
    96. break
    97. end
    98. -- 栈顶比下一层长,要把栈顶合并到下一层
    99. --删除栈顶,栈顶和下一层合并层更大的串,此时下一层边栈顶
    100. stack[i] = stack[i] .. table.remove(stack)
    101. --合成了新的栈顶之后,要再往下检查是否有更长的串,不然继续重复上面的合并
    102. end
    103. end
    104. local s = newStack()
    105. for line in io.lines() do
    106. addString(s, line .. "\n")
    107. end
    108. s = toString(s)
    109. ---------------table.concat---------------
    110. --底层是C实现,所以性能优异
    111. local t = {}
    112. for line in io.lines() do
    113. table.insert(t, line)
    114. end
    115. s = table.concat(t, "\n") .. "\n" -- 将数组t的全部元素以\n作为连接符,连接起来。
    116. -- 最后一个元素尾部不会有连接符,下面的技巧完美解决
    117. table.insert(t, "") --解决最后一个元素尾部没有换行符的问题。
    118. s = table.concat(t, "\n")