Lua 之資料結構

2022-09-16 01:54:15 字數 4347 閱讀 7777

通過整數下標訪問的table中的元素,即是陣列,下標預設從1開始。

乙個建立二維陣列的例子:

mt ={}

for i = 1, 10

domt[i] ={}

for j = 1, 10

domt[i][j] = 0

endend

list = nil

list =

list =

local l =list

while l do

print

(l.value)

l = l.next

end

queue ={}

function

queue.new()

return

endfunction

queue.push(q, val)

local last = q.last + 1

q.last =last

q[last] =val

endfunction

queue.pop(q)

local first =q.first

if first > q.last then

error("

queue is empty")

endlocal val =q[first]

q[first] = nil

q.first = q.first + 1

return

valend

q =queue.new()

for i=1,10,2

doqueue.push(q, i)

endfor i=q.first,q.last do

print

(queue.pop(q))

end

類似於python的set結構,例如:

function

set(list)

local s ={}

for _, n in

ipairs(list) do

s[n] = true

endreturn

send

reserved = set

reserved.beijing

--true

reserved.shanghai --

nil

假如需要讀取乙個檔案的內容,常用的方式如下:

local buff = ""

for line in

io.lines() do

buff = buff .. line .. "\n"

endprint(buff)

假設每行有20 bytes,已讀了2500行,那麼buff現在就是50000b,當lua做字串連線時,就新建乙個50020b的新字串,並從buff中複製了50000b到這個新字串。這樣,對於後面的每一行,lua都需要移動更多的記憶體,顯然,這樣做效率是比較低的。

下面是乙個改進的版本,利用table做緩衝,最後利用table.concat將所有行連線起來:

local t ={}

for line in

io.lines() do

t[#t+1] =line

endlocal s = table.concat(t, '

\n')

那麼問題來了,concat的內部工作原理是什麼呢,它在連線字串的時候如何做到高效執行呢?

將每次需要連線的字串壓入堆疊,如果新加入的字串比棧頂字串更大,就將兩者連線。然後,再將連線後的新字串與更下面的字串比較,如果是新建字串更長的話,則再次連線它們。這樣的連線一直向下延續應用,直到遇到乙個更大的字串或者達到了棧底。

function

newstack()

return

endfunction

push(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

break

endstack[i] = stack[i] .. table.remove

(stack)

endend

local s =newstack()

for line in

io.lines() do

push(s, line .. "\n

")end

下面是乙個廣度優先遍歷有向圖的例子,其中raw描述了圖的所有邊,每個邊有兩個點——起點、終點。

用了乙個table來表示點,它有兩個字段,name和adj,name表示該點的名稱,adj表示它的終點。

列印乙個lua物件:

function

serialize(o)

iftype(o) == "

number

"then

io.write

(o)

elseif

type(o) == "

string

"then

io.write(string.format("%q"

, o))

elseif

type(o) == "

table

"then

io.write("\n"

)

else

error("

cannot serialize a

" .. type

(o))

endend

local l = }

serialize(l)

輸出內容:

,}

Lua資料結構

1.簡介 lua語言只有一種基本資料結構,那就是table,所有其他資料結構如陣列啦,類啦,都可以由table實現.2.table的下標 例e05.lua arrays mydata mydata 0 foo mydata 1 42 hash tables mydata bar baz iterat...

Lua資料結構。

方法一 local function dotest array for i 1,4 do array i for j 1,4 do array i j 12 end end for i 1,4 dofor j 1,4 do print array i j endend end 方法二 local f...

lua資料結構

1.說明 k v資料結構,k非nil的任意型別 2.賦值local tab 初始化 key 預設 local tab 訪問 tab 1 key 數字 local tab 訪問 tab 60 key 字串 local tab 訪問 tab.aa 1.方法一 local tab 1.增table.ins...