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 .. " " --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," ") --第二个参数表示在每两个string值间插入的值
Graphs--没看懂讲的是啥。。。标记