Lua數據結構

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 中的字符串鏈接起來
相關文章
相關標籤/搜索