Lua学习之数据结构

学习了一下Lua里的数据结构,都是文档上面的例子,就是把它敲一遍而已看一下输出结果。仍然使用LuaEditor(v6.30)进行编译和运行。
1. 顺序表和多维数组
2. 链表
3. 双向链表
一.顺序表
顺序表不必多说,和一维数组是一样的。二维数组,就是元素是数组的一维数组。
上个例子:

list = {}
local i = 1
local value = io.read()
while value do
    list[i] = value
    i = i + 1
    value = io.read()
end

for j=1,#list do
    print (list[j])
end

下面看运行结果,我们可以输入数字也可以输入字符串,结束的时候,我们输入Ctrl+z结束输入。
Lua学习之数据结构_第1张图片
数组大家都比较了解,就不做叙述了。
二.链表
相比于使用C语言来描述链表,用Lua来描述,会简洁很多。我们可以聊表中的每一个节点看成一个table,table 里面包含两个数据,一个是这个节点的值,另一个是指向下一个节点的“指针”。不多说了,上码:

list = nil
local v = io.read()
while v do
    list = {next = list, value = v}
    v = io.read()   
end

local l = list
while l do
    print (l.value)
    l = l.next
end

上结果:
Lua学习之数据结构_第2张图片
三.双向链表
参照文档上面的例子,给双向链表定义了四个操作,分别是左插入、左删除、右插入、右删除。或者是,头插入、头删除、右插入、右删除,都是一样的。不由得想起了使用STL里的deque,list。博主是一名C++程序猿。
上码:

List = {}

function List.new ()
    return {first = 0,last = 0}
end

function List.pushleft (list , value)
    list[list.first] = value
    list.first = list.first - 1
end

function List.pushright (list , value)
    list.last = list.last + 1
    list[list.last] = value
end

function List.popleft (list)
    local first = list.first
    if first == list.last then
        print ("list is empty")
    end
    local value = list[first]
    list[first] = nil -- to allow garbage collection 
    list.first = first + 1
    return value
end

function List.popright (list)
    local last = list.last
    if list.first == last then
        print("List is empty")
    end
    local value = list[last]
    list[last] = nil -- wo allow garbage collection
    list.last = last - 1
    return value
end

function List.Print (list)
    for i = list.first + 1, list.last  do
        print (list[i])
    end
end

MyList = List.new()

List.pushleft(MyList,10)
List.pushleft(MyList,20)
List.pushleft(MyList,30)
List.Print(MyList)

List.popleft (MyList)
List.Print(MyList)

这个需要多组数据来测试,这里不一一测试了,只是简单的运行了一下,得到结果。
Lua学习之数据结构_第3张图片

你可能感兴趣的:(Lua)