Lua怎么把列表当作栈用?

文章导读
Previous Quiz Next 栈是一种重要的数据结构,它基于后进先出(LIFO)原则运行。它表示一个元素集合,其中最近添加的元素在移除时具有优先权。Lua 中的栈可以通过列表来实现。我们可以使用 push 方法将元素添加到栈顶,而 pop 方法则移除并返回栈顶元
📋 目录
  1. push 方法实现
  2. pop 方法实现
  3. 测试栈操作
  4. 完整示例 - 使用 List 实现的 Stack
A A

Lua - 列表作为栈



Previous
Quiz
Next

栈是一种重要的数据结构,它基于后进先出(LIFO)原则运行。它表示一个元素集合,其中最近添加的元素在移除时具有优先权。Lua 中的栈可以通过列表来实现。我们可以使用 push 方法将元素添加到栈顶,而 pop 方法则移除并返回栈顶元素。

push 方法实现

push() 操作期间,元素将被推入链表的末尾。相应的 prevnext 引用将被更新。

-- 将元素推入列表末尾
function list:push(t)
   -- 移动到最后一个节点    
   if self.last then
      self.last._next = t
      t._prev = self.last
      self.last = t
   else
      -- 将节点设置为第一个节点
      self.first = t
      self.last = t
   end
   -- 增加列表长度
   self.length = self.length + 1
end

pop 方法实现

pop() 操作期间,元素将从链表末尾移除。相应的 prevnext 引用将被更新。

function list:pop()
  -- 如果列表为空
  if not self.last then return end
  
  local returnedValue = self.last
  
  if returnedValue._prev then
    returnedValue._prev._next = nil
    self.last = returnedValue._prev
    returnedValue._prev = nil
  else
    -- 这是唯一一个节点
    self.first = nil
    self.last = nil
  end
  
  self.length = self.length - 1
  return returnedValue
end

测试栈操作

-- 创建栈
local stack = list()

-- 将值推入栈中
stack:push({'A'})
stack:push({'B'})

-- 打印栈的大小
print(stack:size())

-- 从栈中弹出栈顶元素
print(stack:pop())

-- 打印栈的更新后大小
print(stack.size())

-- 从栈中弹出栈顶元素
print(stack:pop())

完整示例 - 使用 List 实现的 Stack

以下是使用链表实现的 Stack 的完整示例。

main.lua

-- List 实现
list = {}
list.__index = list

setmetatable(list, { __call = function(_, ...)
   local t = setmetatable({ length = 0 }, list)
      for _, v in ipairs{...} 
         do t:push(v) 
      end
      return t
   end })

-- 将元素推入列表末尾
function list:push(t)
   -- 移动到最后一个节点    
   if self.last then
      self.last._next = t
      t._prev = self.last
      self.last = t
   else
      -- 将节点设置为第一个节点
      self.first = t
      self.last = t
   end
   -- 增加列表长度
   self.length = self.length + 1
end

function list:pop()
  -- 如果列表为空
  if not self.last then return end
  
  local returnedValue = self.last
  
  if returnedValue._prev then
    returnedValue._prev._next = nil
    self.last = returnedValue._prev
    returnedValue._prev = nil
  else
    -- 这是唯一一个节点
    self.first = nil
    self.last = nil
  end
  
  self.length = self.length - 1
  return returnedValue
end

function list:size()
   return self.length
end

-- 创建 stack
local stack = list()

-- 将值推入 stack
stack:push({'A'})
stack:push({'B'})

-- 打印 stack 的大小
print("Stack Initial Size:", stack:size())

-- 从 stack 弹出顶部元素
print("Value Popped: ", stack:pop()[1])

-- 打印更新后的 stack 大小
print("Stack Updated Size:", stack:size())

-- 从 stack 弹出顶部元素
print("Value Popped: ", stack:pop()[1])

-- 打印更新后的 stack 大小
print("Stack Updated Size:", stack:size())

输出

运行上述代码时,我们将得到以下输出−

Stack Initial Size:	2
Value Popped: 	B
Stack Updated Size:	1
Value Popped: 	A
Stack Updated Size:	0