Stacks and Queues
Queue from Two Stacks
Implement queue behavior with an input stack and an output stack.
Algorithm
Basic Implementation
basic.php
<?php
function render_values(array $values): string { return implode(" -> ", $values); }
$inStack = [];
$outStack = [];
foreach ([10, 20, 30] as $value) { $inStack[] = $value; }
while (count($inStack) > 0) { $outStack[] = array_pop($inStack); }
$removed = [];
while (count($outStack) > 0) { $removed[] = array_pop($outStack); }
echo render_values($removed) . PHP_EOL;
Complexity
- Time: O(1) amortized per operation
- Space: O(n)
Implementation notes
$inStack = []and$outStack = []are plain PHP arrays used as stacks; the trace begins with both empty.- Enqueue uses
foreach ([10, 20, 30] as $value) { $inStack[] = $value; }, so values append to the back of$inStack. - After enqueue, the replay shows
$inStackas[10, 20, 30]and$outStackstill empty. - The transfer loop runs while
count($inStack) > 0and moves values with$outStack[] = array_pop($inStack). - Because
array_popremoves the last appended value, the transfer reverses the stack into$outStack = [30, 20, 10]and leaves$inStack = []. $removed = []records dequeued values separately.- The dequeue loop uses
$removed[] = array_pop($outStack), so popping the output stack returns10, then20, then30. - The trace ends with
$removed = [10, 20, 30]and$outStack = []. render_values($removed)joins the dequeued order with" -> ", andecho ... . PHP_EOLprints10 -> 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.