Stacks and Queues
Queue from Two Stacks
Implement queue behavior with an input stack and an output stack.
Algorithm
Basic Implementation
basic.js
function render(values) {
return values.join(" -> ");
}
const inStack = [];
const outStack = [];
for (const value of [10, 20, 30]) {
inStack.push(value);
}
while (inStack.length > 0) {
outStack.push(inStack.pop());
}
const removed = [];
while (outStack.length > 0) {
removed.push(outStack.pop());
}
console.log(render(removed));
Complexity
- Time: O(1) amortized per operation
- Space: O(n)
Implementation notes
- JavaScript represents both stacks with mutable
Arrayobjects holdingNumbervalues. Enqueue appends toinStackwithpush, so the input stack becomes[10, 20, 30]without replacing the array. - Transfer uses
inStack.pop()andoutStack.push(...)until the input stack is empty. Each value moves once from input to output, giving the usual amortized queue cost even though this replay performs the transfer in one batch. - The transfer reverses stack order: the replay moves from
inStack = [10, 20, 30],outStack = []toinStack = [],outStack = [30, 20, 10]. PoppingoutStackthen removes10,20, and30in FIFO order intoremoved = [10, 20, 30]. render(removed)usesvalues.join(" -> "), soconsole.logprints10 -> 20 -> 30. Allocation is limited to the short input literal,inStack,outStack,removed, and the joined output string, all managed by the JavaScript runtime GC.
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.