class QueueUsingStacks { private stack1: number[] = []; private stack2: number[] = []; enqueue(value: number) { this.stack1.push(value); } dequeue(): number | undefined { if (this.stack2.length === 0) { while (this.stack1.length > 0) { this.stack2.push(this.stack1.pop()!); } } return this.stack2.pop(); } printQueue() { const tempStack = [...this.stack2].reverse().concat(this.stack1); console.log(tempStack.join(' -> ') + ' -> null'); } } const queue = new QueueUsingStacks(); queue.enqueue(10); queue.enqueue(20); queue.enqueue(30); queue.dequeue(); queue.enqueue(40); queue.printQueue();
After enqueueing 10, 20, 30, the queue is [10, 20, 30].
Dequeue removes 10, so the queue becomes [20, 30].
Enqueue 40 adds it to the end, so queue is [20, 30, 40].
Printing shows 20 -> 30 -> 40 -> null.
class QueueUsingStacks { private stack1: number[] = []; private stack2: number[] = []; enqueue(value: number) { this.stack1.push(value); } dequeue(): number | undefined { if (this.stack2.length === 0) { while (this.stack1.length > 0) { this.stack2.push(this.stack1.pop()!); } } return this.stack2.pop(); } printQueue() { const tempStack = [...this.stack2].reverse().concat(this.stack1); console.log(tempStack.join(' -> ') + ' -> null'); } } const queue = new QueueUsingStacks(); queue.enqueue(5); queue.enqueue(15); queue.enqueue(25); queue.dequeue(); queue.dequeue(); queue.printQueue();
Enqueue 5, 15, 25 gives queue [5, 15, 25].
Dequeue removes 5, then 15, leaving [25].
Printing shows 25 -> null.
class QueueUsingStacks { private stack1: number[] = []; private stack2: number[] = []; enqueue(value: number) { this.stack1.push(value); } dequeue(): number { if (this.stack2.length === 0) { while (this.stack1.length > 0) { this.stack2.push(this.stack1.pop()!); } } return this.stack2.pop()!; } } const queue = new QueueUsingStacks(); queue.dequeue();
Calling pop() on an empty array returns undefined. No runtime error occurs because the non-null assertion operator (!) is a TypeScript compile-time feature and does not affect JavaScript runtime behavior. The function returns undefined.
One stack collects elements as they come (LIFO order).
When dequeue is needed, elements are moved to the second stack, reversing order to FIFO.
This simulates queue behavior using stacks.
class QueueUsingStacks { private stack1: number[] = []; private stack2: number[] = []; enqueue(value: number) { this.stack1.push(value); } dequeue(): number | undefined { if (this.stack2.length === 0) { while (this.stack1.length > 0) { this.stack2.push(this.stack1.pop()!); } } return this.stack2.pop(); } printQueue() { const tempStack = [...this.stack2].reverse().concat(this.stack1); console.log(tempStack.join(' -> ') + ' -> null'); } } const queue = new QueueUsingStacks(); queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); queue.dequeue(); queue.enqueue(4); queue.dequeue(); queue.enqueue(5); queue.printQueue();
Enqueue 1,2,3 → queue: [1,2,3]
Dequeue removes 1 → queue: [2,3]
Enqueue 4 → queue: [2,3,4]
Dequeue removes 2 → queue: [3,4]
Enqueue 5 → queue: [3,4,5]
Printed as 3 -> 4 -> 5 -> null.
