Open In App

C++ Program to Implement Circular Queue

Last Updated : 24 May, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

In C++, Queues are a fundamental data structure in computer science which works on the principle of FIFO (First In, First Out). They can be implemented using both array and linked list. A circular queue is a type of queue in which the last element is connected to the first element, forming a circular structure. In this article, we'll learn about circular queue, how to implement it in C++, and analyze its complexity.

What is Circular Queue in C++?

In a circular queue is a queue where the last element of the queue is connected to the first element of the queue. As it is a queue, it follows the FIFO (First-In-First-Out) order of operation. It is also known as "Ring buffer" as the resulted data structure is logically circular.

Circular--Queue-in-C

Consider a scenario where you're simulating a printer queue. New documents are constantly being added to the queue, and as they are printed, they are removed. In a circular queue, if the queue becomes full and documents are printed, new documents can still be added at the beginning of the queue, as it is circular in nature.

Why we need Circular Queue in C++?

Circular queue concept is especially helpful when the queue is implemented using an array. In linear implementation, when the rear pointer reaches the end of the queue, we cannot insert new elements even if there are empty locations in the queue.

Circular queues address this limitation by connecting the front and rear ends, allowing the rear to go back to the start in when the rear reaches the end of the queue.

Concept Behind Circular Queue

There are two different concepts behind circular queue depending upon which data structure it is using in its implementation:

For Linked List Implementation, we can directly use the circular linked list where the last element of the list points to the head of the list.

For Array Implementation

For array implementation for circular queue, we use the mathematical concept of modular (or circular) increment. In this concept, a value that is being incremented will wrap around a particular threshold value. It can be achieved using the formula.

value = (value + 1) % threshold_value;

For Example, if value is 9, and threshold is 10. Incrementing the value by 1 will make it 10 and dividing it with 10 will yield the remainder 0.

Basic Operations on Circular Queue in C++

The basic operations of the circular queue are same as that of normal queue but the implementation is different. The following table list the basic operations in circular queue:

Operation

Description

Time Complexity

Space Complexity

Enqueue

This function is used to insert an element into the circular queue.

O(1)

O(1)

Dequeue

This function is used to delete an element from the circular queue.

O(1)

O(1)

Peek

Returns the front element of the queue.

O(1)

O(1)

IsFull

Returns true is the queue is full otherwise returns false.

O(1)

O(1)

IsEmpty

Returns true is the queue is empty otherwise returns false.

O(1)

O(1)

Representation of Circular Queue in C++

The circular queue in C++ can be represented as a class which contains the rear and front index pointers, array to store queue elements, and the member functions to provide the basic operations.

class Queue {
private:
int front, rear;
int arr[MAX_SIZE];
public
........
}

Implementation of isEmpty for Circular Queue

The queue is only empty when the front == rear pointer

Algorithm of isEmpty

if front is equal to rear
return true
else
return false

Implementation of isFull for Circular Queue

The queue will be full when the incremented rear pointer is equal to the front pointer.

Algorithm of isFull

if (rear + 1) % size is equal to front
return true;
else
return false;

Implementation of Enqueue for Circular Queue

We insert the new elements at the end of the queue using rear pointer. We first check if the queue is full or not.

Algorithm of Enqueue

if (isFull(queue)) {
print "Queue Overflow"
return
else
rear = (rear + 1) % size
arr[rear] = new_element

Implementation of Dequeue for Circular Queue

The elements are removed from the queue at the front of the queue. We first need to check whether queue is empty or not.

Algorithm of Enqueue

if (isEmpty(queue)) {
print "Queue Underflow"
return
else
front = (front + 1) % size

C++ Program to Implement Circular Queue Using Array


Output
Queue Overflow!
Queue Overflow!
123

C++ Program for Circular Linked List Queue Implementation

This C++ program demonstrates the implementation of a queue using a circular linked list. It includes operations to enqueue (add) and dequeue (remove) elements, as well as check if the queue is empty or full. The circular nature of the linked list ensures efficient use of memory by reusing nodes, without the use of any extra concept like in the array implementation


Output
Queue after all enqueue: 2 4 3 6 5 
Queue after one dequeue: 4 3 6 5 



Next Article
Article Tags :
Practice Tags :

Similar Reads