最近研究Lua,順便寫點(diǎn)筆記吧!數(shù)據(jù)結(jié)構(gòu)是沒有語言之分的,只不過不同的語言實(shí)現(xiàn)起來的語法不同,既然是Lua菜鳥,就來實(shí)現(xiàn)幾個常用的數(shù)據(jù)結(jié)構(gòu)來練練語法吧!首先是作為數(shù)據(jù)結(jié)構(gòu)基石的數(shù)組,在Lua中數(shù)組是用表來實(shí)現(xiàn)的,表是個強(qiáng)大的東西,能表示太多東西了,當(dāng)表中元素的下標(biāo)都是整數(shù)的時候,我們把這個表稱作數(shù)組。數(shù)組的大小不固定,可以動態(tài)的增長。
--創(chuàng)建一個簡單的數(shù)組
local arr1 = {1,2,3,4,5,6}
--遍歷數(shù)組中得每一個元素
for i,v in ipairs(arr1) do
print(v)
end
--另一種創(chuàng)建數(shù)組的方式
local arr2 = {}
for i=1,10 do
arr2[i] = i
print(arr2[i])
end
--創(chuàng)建數(shù)組,下標(biāo)從2開始
local arr2 = {[2]="hello",[3]="xiao",[4]="ta",[5]="zaojiahua"}
--使用迭代器ipairs遍歷的時候輸出為空值,因?yàn)閍rr2[1]=nil當(dāng)ipairs遇到空值的時候就返回了
for i,v in ipairs(arr2) do
print(i,v)
end
--這個時候需要使用pairs遍歷
for i,v in pairs(arr2) do
print(i,v)
end
創(chuàng)建數(shù)組的時候整數(shù)下標(biāo)最好從1開始,因?yàn)檫@個值是Lua中默認(rèn)開始的下標(biāo),這和其他語言的下標(biāo)從零開始有點(diǎn)區(qū)別,如果你采用其他的數(shù)字下標(biāo)開始,使用某些Lua庫的時候可能不能獲得預(yù)期的結(jié)果。然后就是遍歷數(shù)組的方式,我們用到了迭代器ipairs()和pairs(),這個使用時候的區(qū)別代碼已經(jīng)有體現(xiàn)了,ipairs中得i代表的就是整數(shù)下標(biāo),從1開始。
--創(chuàng)建一個10*5的二維數(shù)組
local int_arr = {}
for i=1,10 do
int_arr[i] = {}
for j=1,5 do
int_arr[i][j] = j
end
end
--遍歷二維數(shù)組
for i,v in ipairs(int_arr) do
for j,k in ipairs(v) do
io.write(k.."\t")
end
print("\n")
end
接下來實(shí)現(xiàn)一個鏈表,鏈表的每個節(jié)點(diǎn)用一個table表示,table中的字段包括指向下一個節(jié)點(diǎn)的指針和該節(jié)點(diǎn)的數(shù)據(jù)元素,這里只是提供一個思路,其他的東西可以用的時候擴(kuò)展。
--實(shí)現(xiàn)一個鏈表
local list = nil
--鏈表元素包含倆個字段,next代表的是指針,指向下一個鏈表元素,value代表的是該鏈表元素的值
for i=1,10 do
list = {next = list,value = i}
end
--鏈表的遍歷
local l = list
while l do
print(l.value)
l = l.next
end
接下來實(shí)現(xiàn)一個比較有用的數(shù)據(jù)結(jié)構(gòu)——隊(duì)列。我把隊(duì)列封裝在了一個table表中,關(guān)于隊(duì)列的操作和表示隊(duì)列頭和隊(duì)列尾的指針也封裝在了一起。當(dāng)對頭等于隊(duì)尾的時候表示沒有元素,而這個隊(duì)列是可以無限增大的,并沒有隊(duì)列滿的限制,大家可以根據(jù)自己的需要進(jìn)行擴(kuò)展。
--實(shí)現(xiàn)一個隊(duì)列 包括頭指針first和尾指針last first==last的時候代表隊(duì)列為空
local Que = {first=0,last=0}
--向隊(duì)列中添加元素,last索引指向最后一個元素的下一個元素,first索引指向的是第一個元素
function Que:push(value)
local last = self.last
self[last] = value
self.last = last+1
end
--移除元素,隊(duì)列的特點(diǎn)是先進(jìn)先出
function Que:pop()
if self.first == self.last then
print("隊(duì)列空")
return nil
end
local first = self.first
self.first = first+1
return self[first]
end
--顯示隊(duì)列中得元素
function Que:showValue()
for i=self.first,self.last-1 do
print("value:"..self[i])
end
end
--測試
print("隊(duì)列測試")
Que:showValue()
Que:push(2)
Que:push(3)
print("push 2,3")
Que:showValue()
Que:push(3)
print("push 3")
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("push 100")
Que:push(100)
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())
Que:showValue()
print("pop:"..Que:pop())