Stacks and Queues
Queue from Two Stacks
Implement queue behavior with an input stack and an output stack.
Algorithm
The replay uses the same three values in every language, so this PHP DSA implementation can be compared directly with the rest of the DSA track.
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.
Visual walkthrough
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.