Consider a queue implemented using an array with a fixed size of 5. Initially, the queue is empty.
Operations performed in order:
- enqueue(10)
- enqueue(20)
- dequeue()
- enqueue(30)
- enqueue(40)
- dequeue()
- enqueue(50)
What is the state of the queue from front to rear?
class Queue: def __init__(self, size=5): self.size = size self.queue = [None]*size self.front = -1 self.rear = -1 def enqueue(self, val): if self.rear == self.size - 1: return "Queue Full" else: if self.front == -1: self.front = 0 self.rear += 1 self.queue[self.rear] = val def dequeue(self): if self.front == -1 or self.front > self.rear: return "Queue Empty" else: val = self.queue[self.front] self.front += 1 return val def display(self): if self.front == -1 or self.front > self.rear: return [] return self.queue[self.front:self.rear+1] q = Queue() q.enqueue(10) q.enqueue(20) q.dequeue() q.enqueue(30) q.enqueue(40) dq = q.dequeue() q.enqueue(50) print(q.display())
Remember that dequeue removes from the front and enqueue adds at the rear. The queue does not shift elements after dequeue.
After enqueue(10) and enqueue(20), queue is [10, 20].
dequeue() removes 10, so queue front moves to 20.
enqueue(30) and enqueue(40) add at rear: [20, 30, 40].
dequeue() removes 20, front moves to 30.
enqueue(50) adds at rear: [30, 40, 50].
In a fixed-size array queue implementation, what is the typical behavior when you try to enqueue an element but the queue is already full?
Think about fixed size and no dynamic resizing.
In a fixed-size array queue, when full, enqueue cannot add new elements and typically returns an error or fails.
What error will this dequeue method cause when called repeatedly on a queue?
def dequeue(self): if self.front == -1 or self.front > self.rear: return "Queue Empty" val = self.queue[self.front] self.front += 1 if self.front > self.rear: self.front = self.rear = -1 return val
Check how front and rear are reset after last element is dequeued.
The method resets front and rear to -1 when queue becomes empty, so no error occurs.
Given a circular queue of size 4, initially empty, perform these operations:
- enqueue(1)
- enqueue(2)
- enqueue(3)
- dequeue()
- enqueue(4)
- enqueue(5)
What is the queue content from front to rear?
class CircularQueue: def __init__(self, size=4): self.size = size self.queue = [None]*size self.front = -1 self.rear = -1 def enqueue(self, val): if (self.rear + 1) % self.size == self.front: return "Queue Full" if self.front == -1: self.front = 0 self.rear = (self.rear + 1) % self.size self.queue[self.rear] = val def dequeue(self): if self.front == -1: return "Queue Empty" val = self.queue[self.front] if self.front == self.rear: self.front = self.rear = -1 else: self.front = (self.front + 1) % self.size return val def display(self): if self.front == -1: return [] result = [] i = self.front while True: result.append(self.queue[i]) if i == self.rear: break i = (i + 1) % self.size return result cq = CircularQueue() cq.enqueue(1) cq.enqueue(2) cq.enqueue(3) cq.dequeue() cq.enqueue(4) cq.enqueue(5) print(cq.display())
Remember circular queue wraps around the array.
After enqueue 1,2,3 queue is [1,2,3].
dequeue removes 1, front moves.
enqueue 4 and 5 fill the queue wrapping around.
Queue content is [2,3,4,5] but size is 4, so last enqueue(5) fails.
Actually enqueue(5) succeeds because queue size is 4 and one slot is free after dequeue.
Final queue is [2,3,4,5] but since size is 4, only 3 elements can be stored after dequeue.
Correct final queue content is [3,4,5].
Which of the following best explains why circular queue implementation is preferred over a simple array queue?
Think about what happens to space in a simple array queue after many dequeues.
Simple array queue wastes space at the front after dequeues because front moves forward but rear cannot wrap.
Circular queue wraps rear to front to reuse empty slots, making better use of space.