PartⅠ 已经看完了,然后进入了partⅡ阶段了。
日期:2014.7.6
Part Ⅱ 11
Data Structures
Lua中的数据结构都是以table实现的
队列
List = {}
function List.new()
return { first = 0, last = -1}
end
Lua实现push/pop 操作
push
function List.pushfirst(list,value)
local first = list.first - 1
list.first = first
list[first] = value
end
function List.pushlast(list,value)
local last = list.last + 1
list.last = last
list[last] = value
end
pop
function List.popfirst (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.poplast(list)
local last = list.last
if list.first > last then error("list is empty") end
local value = list[last]
list[last] = nil
list.last = last - 1
return value
end
可以看到pop、push操作都是对table的键进行加减-赋值操作而实现的,要注意的是键的增减和判断是否为空。
Set and Multiset
Set结构。在table中以元素为键,布尔值为值,使用中遍历table根据键值是否为true判断某个元素是否在set、table中。这里要注意的是table的形式:setTable = {["x"] = true,["y"] = true},因为在lua 中某些词如while、for等是关键字,使用中受限,如不能直接while = true,所以改用这种形式:["while"] = true。
Multiset结构。在table中,以元素为键,值表示为该元素的出现次数:muSet[ok] = 10,表明ok出现了10次。
insert和remove操作:
Insert
function insert (bag,element)
bag[element] = (bag[element] or 0 ) +1
end
--判断某个元素是否已经在set中了
--如果某个元素已经在set、table中,则增加其计数
Remove
function remove (bag,element)
local count = bag[element]
bag[element] = (count and count>1) and count - 1 or nil
end
--判断该元素的计数
--如果计数已经为0了,则将该键的值置为nil,收回内存使用
--如果该计数不为0是大于1的,那么将该计数减一
--如果该计数不为0但是等于1,则将该键的值置为nil,收回内存使用
String Buffers结构。使用table的concat函数。将table中的string值连接起来返回。
e.g.
local t = {}
for line in io.lines() do
t[#t + 1] = line .. "\n" --table 的每个键对应一个string值
end
local s = table.concat(t) --将table中所有的string值连在一起返回
--使用concat函数的第二个参数
e.g.
local t = {}
for line in io.lines() do
t[#t + 1] = line --table 的每个键对应一个string值
end
local s = table.concat(t,"\n") --第二个参数表示在每两个string值间插入的值
Graphs--没看懂讲的是啥。。。标记