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

来源:互联网 发布:家纺品牌 知乎 编辑:程序博客网 时间:2024/05/15 00:33

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 valueend--[[ @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 endend--[[ @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 endend--[[ @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 endendreturn Stack
0 0