Stacks and Queues
Queue from Two Stacks
Implement queue behavior with an input stack and an output stack.
Algorithm
Basic Implementation
basic.lua
local function render(values)
local parts = {}
for i, value in ipairs(values) do parts[i] = tostring(value) end
return table.concat(parts, " -> ")
end
local in_stack = {}
local out_stack = {}
for _, value in ipairs({10, 20, 30}) do table.insert(in_stack, value) end
while #in_stack > 0 do table.insert(out_stack, table.remove(in_stack)) end
local removed = {}
while #out_stack > 0 do table.insert(removed, table.remove(out_stack)) end
print(render(removed))
Complexity
- Time: O(1) amortized per operation
- Space: O(n)
Implementation notes
local in_stack = {}andlocal out_stack = {}start as two empty Lua tables, matching the trace state[]and[].- Enqueue iterates
ipairs({10, 20, 30})and usestable.insert(in_stack, value), so the input stack becomes[10, 20, 30]. - In this source, the stack top is the end of the table.
- The transfer loop runs while
#in_stack > 0and moves values withtable.insert(out_stack, table.remove(in_stack)). - Bare
table.remove(in_stack)pops the last value, so the transfer reverses the order intoout_stack = [30, 20, 10]and leavesin_stack = []. - Dequeue then pops from the output stack with
table.insert(removed, table.remove(out_stack)). - Popping the end of
[30, 20, 10]returns10first, then20, then30. - The trace ends with
removed = [10, 20, 30]andout_stack = []. render(removed)usesipairsandtable.concat(parts, " -> "), soprint(render(removed))outputs10 -> 20 -> 30.
input stack
Enqueue pushes new values onto the input stack.
output stack
When the output stack is empty, transferring all input values reverses them into dequeue order.