Queue Implementation Using Array in DSA Typescript - Time & Space Complexity
We want to understand how the time taken by queue operations changes as the number of items grows.
Specifically, how fast can we add or remove items using an array-based queue?
Analyze the time complexity of the following queue operations using an array.
class Queue {
private items: number[] = [];
enqueue(element: number) {
this.items.push(element); // add to end
}
dequeue() {
return this.items.shift(); // remove from front
}
}
This code adds items to the end and removes items from the front of the array.
Look at the main repeated actions when queue changes.
- Primary operation: Adding with
pushand removing withshift. - How many times: Each operation runs once per enqueue or dequeue call.
- Important detail:
pushadds at the end quickly, butshiftremoves from front and shifts all other elements.
Adding items grows slowly, but removing items costs more as queue grows.
| Input Size (n) | Approx. Operations for dequeue |
|---|---|
| 10 | 10 shifts |
| 100 | 100 shifts |
| 1000 | 1000 shifts |
Pattern observation: Removing from front requires moving all remaining items, so cost grows linearly with queue size.
Time Complexity: O(1) for enqueue, O(n) for dequeue
Adding is fast and constant time, but removing takes longer as the queue grows because elements must shift.
[X] Wrong: "Both enqueue and dequeue are fast and take constant time."
[OK] Correct: Removing from the front with shift moves all other elements, so it takes longer as the queue grows.
Understanding these costs helps you explain why some queue implementations use different data structures for efficiency.
What if we used a circular array with front and rear pointers instead of shifting elements? How would the time complexity change?
Practice
Solution
Step 1: Understand queue behavior
A queue adds elements at the rear and removes from the front, so the first element added is the first removed.Step 2: Compare with options
FIFO means First-In-First-Out, which matches queue behavior. LIFO is for stacks, random access is for arrays, and sorting is unrelated.Final Answer:
It follows First-In-First-Out (FIFO) order -> Option DQuick Check:
Queue = FIFO [OK]
- Confusing queue with stack (LIFO)
- Thinking queue allows random access
- Assuming queue sorts elements automatically
Solution
Step 1: Identify array methods for queue operations
To add at the rear of the queue, we use the array method that appends elements at the end, which is push().Step 2: Check each option
push(x) adds x at the end; pop() removes from end; shift() removes from front; unshift() adds at front.Final Answer:
queue.push(x); -> Option BQuick Check:
Enqueue = push() [OK]
- Using pop() which removes instead of adds
- Using shift() or unshift() incorrectly for enqueue
- Confusing push() with unshift()
const queue: number[] = []; queue.push(10); queue.push(20); const removed = queue.shift(); queue.push(30); console.log(queue);
Solution
Step 1: Trace queue operations step-by-step
Initially queue = []. After push(10), queue = [10]. After push(20), queue = [10, 20]. shift() removes first element 10, queue = [20]. Then push(30), queue = [20, 30].Step 2: Determine final queue state
After all operations, queue contains [20, 30].Final Answer:
[20, 30] -> Option AQuick Check:
After shift(), first element removed, queue = [20, 30] [OK]
- Forgetting shift() removes first element
- Assuming push() adds at front
- Confusing order of elements after operations
const queue: number[] = []; queue.push(1); queue.push(2); const removed = queue.pop(); console.log(queue);
Solution
Step 1: Understand queue removal operation
Queue removes elements from the front (FIFO). Using pop() removes from the rear (last element), which breaks FIFO.Step 2: Check code behavior
pop() removes last element (2), but queue should remove first element (1) using shift().Final Answer:
Using pop() removes from rear, not front -> Option CQuick Check:
Dequeue = shift(), not pop() [OK]
- Using pop() instead of shift() for dequeue
- Thinking push() adds at front
- Confusing array methods for queue operations
Solution
Step 1: Understand fixed-size array queue behavior
With a fixed-size array, rear index moves forward on enqueue. After 3 enqueues, rear is at end.Step 2: Analyze enqueue after dequeue without circular logic
Dequeue moves front forward but rear stays at end. Without circular wrap, rear cannot move back to start, so enqueue fails.Final Answer:
You cannot enqueue the new element because the rear index reached the array end -> Option AQuick Check:
Fixed array + no circular = enqueue blocked at end [OK]
- Assuming array resizes automatically
- Thinking dequeue affects rear index
- Ignoring circular queue necessity
Ready to prove it?
Pass the test and this pattern moves unknown
