📖 Scenario: Imagine a small bakery that uses a circular queue to manage orders. The queue holds up to 5 orders at a time. When the queue is full, new orders wait until space is available. When an order is completed, it is removed from the queue, and the next order moves forward.
🎯 Goal: You will build a circular queue using an array in C. You will create the queue, add orders, remove orders, and finally print the queue state.
📋 What You'll Learn
Create an array of size 5 to hold the queue
Use two integer variables front and rear to track the queue ends
Implement enqueue operation to add an order
Implement dequeue operation to remove an order
Print the queue contents in order from front to rear
💡 Why This Matters
🌍 Real World
Circular queues are used in real-world systems like task scheduling, buffering data streams, and managing resources efficiently in limited space.
💼 Career
Understanding circular queues is important for software developers working on embedded systems, operating systems, and performance-critical applications.
Progress0 / 4 steps
1
Create the Circular Queue Data Structure
Create an integer array called queue of size 5, and two integer variables front and rear both initialized to -1.
DSA C
Hint
Use int queue[5]; to create the array. Set front and rear to -1 to show the queue is empty.
2
Add Helper Variables for Queue Size
Create an integer variable called max_size and set it to 5 to represent the maximum size of the queue.
DSA C
Hint
This variable helps to check when the queue is full or empty.
3
Implement Enqueue and Dequeue Operations
Write two functions: enqueue that takes an integer value and adds it to the queue, and dequeue that removes and returns the front value. Use front, rear, and max_size to handle wrapping around the array.
DSA C
Hint
Use modulo % to wrap rear and front around the array size.
4
Print the Queue Contents
Write a function called printQueue that prints all elements from front to rear in order, separated by spaces. Then, enqueue the values 10, 20, 30, dequeue one element, enqueue 40, and finally call printQueue.
DSA C
Hint
Loop from front to rear using modulo to print all elements. Then test by adding and removing elements as described.
Practice
(1/5)
1. What is the main advantage of using a circular queue over a simple linear queue when implemented using an array?
easy
A. It automatically sorts the elements in the queue
B. It allows storing different data types in the same queue
C. It increases the maximum size of the queue beyond the array length
D. It efficiently uses the array space by reusing freed slots
Solution
Step 1: Understand linear queue limitation
In a linear queue using an array, once the rear reaches the end, no more elements can be added even if there are empty slots at the front.
Step 2: Circular queue advantage
A circular queue connects the end of the array back to the front, allowing reuse of empty slots freed by dequeuing, thus using space efficiently.
Final Answer:
It efficiently uses the array space by reusing freed slots -> Option D
Quick Check:
Circular queue reuses space = Advantage [OK]
Hint: Circular queue reuses space freed by dequeue [OK]
Common Mistakes:
Thinking circular queue increases array size
Believing it sorts elements automatically
Confusing data type flexibility with queue type
2. Which of the following is the correct condition to check if a circular queue is full when using an array of size n with front and rear indices?
easy
A. rear == (front + 1) % n
B. front == rear
C. front == (rear + 1) % n
D. rear == n - 1
Solution
Step 1: Recall circular queue full condition
The queue is full when the next position of rear (circularly) is front, meaning no space to insert new element.
Step 2: Express condition mathematically
This condition is: front == (rear + 1) % n, where % is modulo operator to wrap around.
Final Answer:
front == (rear + 1) % n -> Option C
Quick Check:
Full if front is next to rear circularly = Condition B [OK]
Hint: Full when front is just after rear modulo array size [OK]
Common Mistakes:
Using rear == (front + 1) % n (wrong direction)
Checking front == rear (means empty, not full)
Checking rear == n - 1 (linear queue condition)
3. Consider a circular queue of size 5 (indices 0 to 4). Initially, front = -1 and rear = -1. After the following operations: enqueue(10), enqueue(20), enqueue(30), dequeue(), enqueue(40), enqueue(50), enqueue(60) What will be the values of front and rear?
Hint: Track front/rear step-by-step with wrap-around [OK]
Common Mistakes:
Not updating front after dequeue
Forgetting rear wraps to 0 after reaching end
Mixing front and rear indices
4. Given the following code snippet for dequeue operation in a circular queue, identify the error:
int dequeue() {
if (front == -1) {
printf("Queue is empty\n");
return -1;
}
int data = queue[front];
if (front == rear) {
front = rear = -1;
} else {
front = front + 1;
}
return data;
}
medium
A. front should be updated as (front + 1) % size to wrap around
B. rear should be incremented instead of front
C. The check for empty queue is incorrect
D. Data should be returned after updating front
Solution
Step 1: Understand circular queue front update
In circular queue, front index must wrap around using modulo when incremented to stay within array bounds.
Step 2: Identify error in front update
Code uses front = front + 1; which can go beyond array size. Correct is front = (front + 1) % size.
Final Answer:
front should be updated as (front + 1) % size to wrap around -> Option A
Quick Check:
Use modulo for front increment in circular queue [OK]
Hint: Use modulo when incrementing front or rear [OK]
Common Mistakes:
Incrementing front without modulo wrap
Confusing front and rear updates
Returning data before updating front
5. You have a circular queue of size 6. After performing these operations: enqueue(5), enqueue(10), enqueue(15), dequeue(), dequeue(), enqueue(20), enqueue(25), enqueue(30), enqueue(35) What will be the queue content from front to rear?