Data Structures with Tables

-- Stack
local Stack = {}
Stack.__index = Stack
function Stack.new() return setmetatable({items = {}, size = 0}, Stack) end
function Stack:push(v) self.size = self.size + 1; self.items[self.size] = v end
function Stack:pop()
    if self.size == 0 then return nil end
    local v = self.items[self.size]
    self.items[self.size] = nil
    self.size = self.size - 1
    return v
end
function Stack:peek() return self.items[self.size] end

-- Queue / deque with two indices (O(1) operations)
local Queue = {}
Queue.__index = Queue
function Queue.new() return setmetatable({first = 1, last = 0, items = {}}, Queue) end
function Queue:push(v) self.last = self.last + 1; self.items[self.last] = v end
function Queue:pop()
    if self.first > self.last then return nil end
    local v = self.items[self.first]
    self.items[self.first] = nil
    self.first = self.first + 1
    return v
end
function Queue:is_empty() return self.first > self.last end

-- Linked list
local list = nil
for _, v in ipairs({3, 2, 1}) do list = {value = v, next = list} end
local node = list
while node do print(node.value); node = node.next end

-- Matrix (2D array)
local function matrix(rows, cols, init)
    local m = {}
 
…