学习了一下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结束输入。
数组大家都比较了解,就不做叙述了。
二.链表
相比于使用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
上结果:
三.双向链表
参照文档上面的例子,给双向链表定义了四个操作,分别是左插入、左删除、右插入、右删除。或者是,头插入、头删除、右插入、右删除,都是一样的。不由得想起了使用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)
这个需要多组数据来测试,这里不一一测试了,只是简单的运行了一下,得到结果。