您的位置:首页 > 编程语言 > Lua

lua 栈,checkElement支持删除元素操作

2015-08-03 12:31 507 查看
lua 栈,checkElement支持删除元素操作

--[[
--Stack
@author xiaowa
@date 2015.5.17
--]]

local Stack = Stack or class("Stack")

function Stack:ctor()
self.stack_ = nil
self.stack_end_ = nil --栈末尾的元素
end

--[[
@function 压入栈顶一个元素
@return Element#被压入的元素
--]]
function Stack:pushElement(value)
local ptr = self.stack_
if ptr then
self.stack_end_.next = {}
self.stack_end_.next.value = value
self.stack_end_.next.prev = self.stack_end_ --双向表,这样pop就快
self.stack_end_ = self.stack_end_.next
else --栈没有初始化
self.stack_ = {}
self.stack_.value = value
self.stack_end_ = self.stack_
end
return value
end
--[[
@function 删除某个元素
@return Element#被删除的元素
--]]
function Stack:delElement(value)
assert(value ~= nil, string.format("%s:delElement() - invalid value", self.class.__cname))
local ptr = self.stack_
local ptr_prev
while ptr do
if ptr.value == value then
if ptr_prev then
ptr_prev.next = ptr.next
if ptr.next then
ptr.next.prev = ptr_prev
end
ptr.prev = nil
ptr.next = nil
else --删除第一个元素
self.stack_.next = ptr.next
if ptr.next then
ptr.next.prev = self.stack_
end
ptr.prev = nil
ptr.next = nil
end
return value
end
ptr_prev = ptr
ptr = ptr.next
end
end
--[[
@function 弹出元素
@return Element#value
--]]
function Stack:popElement()
local ptr_prev
ptr_prev = self.stack_end_.prev
if ptr_prev then
ptr_prev.next = nil
self.stack_end_.prev = nil
local value = self.stack_end_.value
self.stack_end_ = ptr_prev
return value
else --self.stack_end_ 是第一个元素,就是只有1个元素了
self.stack_ = nil
local value = self.stack_end_.value
self.stack_end_ = nil
return value
end
end
--[[
@function 检查效果,检查函数中可以对栈进行操作,删除当前检查对象就会停止检查,删除其他对象仍会继续
@param function#检查函数,返回true 时停止检查
@return nil
--]]
function Stack:checkElement(fun)
assert(type(fun) == "function", string.format("%s:checkElement() - invalid value", self.class.__cname))
local ptr = self.stack_
local ptr_prev
while ptr do
if(fun(ptr.value))then return end
ptr_prev = ptr
ptr = ptr.next
end
end

return Stack
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: