初学者,有错误希望指正。
14———————队列和双向队列
--table的insert和remove可以实现队列但是处理大数据时效率太低
--有效的方式是使用连个索引下标,一个表示第一个元素术,另一个表示最后一个元素
--为了避免污染全局命名空间
--lua使用双精度有效的抑制了数据溢出,每秒100万次插入操作可执行200年
List={}
function List.new()
return {first=0,last=-1}
--如果将操作反过来,成立
--return [first=-1,last=0}
--接下来的加减全部翻转,判断也一样
end
}
function List.pushleft (list, value)
local first = list.first - 1
list.first = first
list[first] = value
end
function List.pushright (list, value)
local last = list.last + 1
list.last = last
list[last] = value
end
function List.popleft (list)
local first = list.first
if first > list.last then error("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 error("list is empty") end
local value = list[last]
list[last] = nil -- to allow garbage collection
list.last = last - 1
return value
end
--和前面的链表差不多
function dump(list)
local l=list
local first=l.first
while l do
print(l[first])
l=list[first+1]
end
end
function dump2(list)
local l=list
local first=l.first
while l do
print(l[first])
l=list[first-1]
end
end
a=List.new()
List.pushleft(a,10)
dump(a)
List.pushright(a,11)
dump2(a)
List.popleft(a)
--List.popright(a)
dump(a)
--[[
List.pushleft(a,11)
dump(a)
List.pushright(a,10)
dump(a)