lua中的table不是一種簡單的數據結構,它能夠做爲其餘數據結構的基礎,如:數組,記錄,鏈表,隊列等均可以用它來表示。數組
一、數組數據結構
在lua中,table的索引能夠有不少種表示方式。若是用整數來表示table的索引,便可用table來實現數組,在lua中索引一般都會從1開始。函數
--二維數組 n=10 m=10 arr={} for i=1,n do arr[i]={} for j=1,m do arr[i][j]=i*j end end for i=1, n do for j=1, m do if(j~=m) then io.write(arr[i][j].." ") else print(arr[i][j]) end end end
二、鏈表ui
在lua中,因爲table是動態的實體,因此用來表示鏈表是很方便的,其中每一個節點都用table來表示。lua
list = nil for i = 1, 10 do list = { next = list, value = i} end local l = list while l do print(l.value) l = l.next end
三、隊列與雙端隊列spa
在lua中實現隊列的簡單方法是調用table中insert和remove函數,可是若是數據量較大的話,效率仍是很慢的,下面是手動實現,效率快許多。code
List={} function List.new() return {first=0, last=-1} end function List.pushFront(list,value) list.first=list.first-1 list[ list.first ]=value end function List.pushBack(list,value) list.last=list.last+1 list[ list.last ]=value end function List.popFront(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 List.popBack(list) local last=list.last if last<list.first then error("List is empty!") end local value =list[last] list[last]=nil list.last=last-1 return value end lp=List.new() List.pushFront(lp,1) List.pushFront(lp,2) List.pushBack(lp,-1) List.pushBack(lp,-2) x=List.popFront(lp) print(x) x=List.popBack(lp) print(x) x=List.popFront(lp) print(x) x=List.popBack(lp) print(x) x=List.popBack(lp) print(x) --輸出結果 -- 2 -- -2 -- 1 -- -1 -- lua:... List is empty!
四、集合和包blog
在Lua中用table實現集合是很是簡單的,見以下代碼:
reserved = { ["while"] = true, ["end"] = true, ["function"] = true, }
if not reserved["while"] then
--do something
end
在Lua中咱們能夠將包(Bag)當作MultiSet,與普通集合不一樣的是該容器中容許key相同的元素在容器中屢次出現。下面的代碼經過爲table中的元素添加計數器的方式來模擬實現該數據結構,如:索引
function insert(Bag,element) Bag[element]=(Bag[element] or 0)+1 end function remove(Bag,element) local count=Bag[element] if count >0 then Bag[element]=count-1 else Bag[element]=nil end end
五、StringBuild隊列
若是在lua中將一系列字符串鏈接成大字符串的話,有下面的方法:
低效率:
local buff="" for line in io.lines() do buff=buff..line.."\n" end
高效率:
local t={} for line in io.lines() do if(line==nil) then break end t[#t+1]=line end local s=table.concat(t,"\n") --將table t 中的字符串鏈接起來