Implement a deque Using a circular array:
Deque or Double Ended Queue is a generalized version of the Queue data structure that allows insert and delete at both ends
Operations on Deque:
Mainly the following four basic operations are performed on queue:
- insertFront(): Adds an item at the front of Deque.
- insertRear(): Adds an item at the rear of Deque.
- deleteFront(): Deletes an item from front of Deque.
- deleteRear(): Deletes an item from rear of Deque.
In addition to above operations, following operations are also supported
- getFront(): Gets the front item from queue.
- getRear(): Gets the last item from queue.
- isEmpty(): Checks whether Deque is empty or not.
- isFull(): Checks whether Deque is full or not.

Circular array implementation of Deque:
For implementing deque, we need to keep track of two indices, front, and rear. We enqueue(push) an item at the rear or the front end of the dequeue and dequeue(pop) an item from both the rear and the front end.
Working:
Create an empty array ‘arr’ of size N
initialize front = -1 , rear = 0
Inserting the First element in the deque, at either front or rear will lead to the same result:

Note: After inserting Front Points at 0 and Rear points at 0
Insert Elements at the Rear end of Deque:
a). First we check deque if Full or Not
b). IF Rear == Size-1
then reinitialize Rear = 0 ;
Else increment Rear by ‘1’
and push current key into Arr[ rear ] = key
Front remain same.
Insert Elements at the Front end of Deque:
a). First we check deque if Full or Not
b). IF Front == 0 || initial position, move Front
to points last index of array
front = size – 1
Else decremented front by ‘1’ and push
current key into Arr[ Front] = key
Rear remain same

Delete Element From Rear end of Deque:
First Check deque is Empty or Not
If deque has only one element
front = -1 ; rear =-1;
Else IF Rear points to the first index of array
it’s means we have to move rear to points
last index [ now first inserted element at
front end become rear end ]
rear = size-1;
Else || decrease rear by ‘1’ rear = rear-1;
Delete Element From the Front end of Deque:
a). first Check deque is Empty or Not
b). If deque has only one element
front = -1 ; rear =-1 ;
Else IF front points to the last index of the array
it’s means we have no more elements in array so
we move front to points first index of array
front = 0 ;
Else || increment Front by ‘1’
front = front+1;

Below is the implementation of the above methods:
C++
#include <iostream>
using namespace std;
#define MAX 100
class Deque {
int arr[MAX];
int front;
int rear;
int size;
public :
Deque( int size)
{
front = -1;
rear = 0;
this ->size = size;
}
void insertfront( int key);
void insertrear( int key);
void deletefront();
void deleterear();
bool isFull();
bool isEmpty();
int getFront();
int getRear();
};
bool Deque::isFull()
{
return ((front == 0 && rear == size - 1)
|| front == rear + 1);
}
bool Deque::isEmpty() { return (front == -1); }
void Deque::insertfront( int key)
{
if (isFull()) {
cout << "Overflow\n" << endl;
return ;
}
if (front == -1) {
front = 0;
rear = 0;
}
else if (front == 0)
front = size - 1;
else
front = front - 1;
arr[front] = key;
}
void Deque ::insertrear( int key)
{
if (isFull()) {
cout << " Overflow\n " << endl;
return ;
}
if (front == -1) {
front = 0;
rear = 0;
}
else if (rear == size - 1)
rear = 0;
else
rear = rear + 1;
arr[rear] = key;
}
void Deque ::deletefront()
{
if (isEmpty()) {
cout << "Queue Underflow\n" << endl;
return ;
}
if (front == rear) {
front = -1;
rear = -1;
}
else
if (front == size - 1)
front = 0;
else
front = front + 1;
}
void Deque::deleterear()
{
if (isEmpty()) {
cout << " Underflow\n" << endl;
return ;
}
if (front == rear) {
front = -1;
rear = -1;
}
else if (rear == 0)
rear = size - 1;
else
rear = rear - 1;
}
int Deque::getFront()
{
if (isEmpty()) {
cout << " Underflow\n" << endl;
return -1;
}
return arr[front];
}
int Deque::getRear()
{
if (isEmpty() || rear < 0) {
cout << " Underflow\n" << endl;
return -1;
}
return arr[rear];
}
int main()
{
Deque dq(5);
cout << "Insert element at rear end : 5 \n" ;
dq.insertrear(5);
cout << "insert element at rear end : 10 \n" ;
dq.insertrear(10);
cout << "get rear element "
<< " " << dq.getRear() << endl;
dq.deleterear();
cout << "After delete rear element new rear"
<< " become " << dq.getRear() << endl;
cout << "inserting element at front end \n" ;
dq.insertfront(15);
cout << "get front element "
<< " " << dq.getFront() << endl;
dq.deletefront();
cout << "After delete front element new "
<< "front become " << dq.getFront() << endl;
return 0;
}
|
Java
class Deque {
static final int MAX = 100 ;
int arr[];
int front;
int rear;
int size;
public Deque( int size)
{
arr = new int [MAX];
front = - 1 ;
rear = 0 ;
this .size = size;
}
boolean isFull()
{
return ((front == 0 && rear == size - 1 )
|| front == rear + 1 );
}
boolean isEmpty() { return (front == - 1 ); }
void insertfront( int key)
{
if (isFull()) {
System.out.println( "Overflow" );
return ;
}
if (front == - 1 ) {
front = 0 ;
rear = 0 ;
}
else if (front == 0 )
front = size - 1 ;
else
front = front - 1 ;
arr[front] = key;
}
void insertrear( int key)
{
if (isFull()) {
System.out.println( " Overflow " );
return ;
}
if (front == - 1 ) {
front = 0 ;
rear = 0 ;
}
else if (rear == size - 1 )
rear = 0 ;
else
rear = rear + 1 ;
arr[rear] = key;
}
void deletefront()
{
if (isEmpty()) {
System.out.println( "Queue Underflow\n" );
return ;
}
if (front == rear) {
front = - 1 ;
rear = - 1 ;
}
else
if (front == size - 1 )
front = 0 ;
else
front = front + 1 ;
}
void deleterear()
{
if (isEmpty()) {
System.out.println( " Underflow" );
return ;
}
if (front == rear) {
front = - 1 ;
rear = - 1 ;
}
else if (rear == 0 )
rear = size - 1 ;
else
rear = rear - 1 ;
}
int getFront()
{
if (isEmpty()) {
System.out.println( " Underflow" );
return - 1 ;
}
return arr[front];
}
int getRear()
{
if (isEmpty() || rear < 0 ) {
System.out.println( " Underflow\n" );
return - 1 ;
}
return arr[rear];
}
public static void main(String[] args)
{
Deque dq = new Deque( 5 );
System.out.println(
"Insert element at rear end : 5 " );
dq.insertrear( 5 );
System.out.println(
"insert element at rear end : 10 " );
dq.insertrear( 10 );
System.out.println( "get rear element : "
+ dq.getRear());
dq.deleterear();
System.out.println(
"After delete rear element new rear become : "
+ dq.getRear());
System.out.println(
"inserting element at front end" );
dq.insertfront( 15 );
System.out.println( "get front element: "
+ dq.getFront());
dq.deletefront();
System.out.println(
"After delete front element new front become : "
+ +dq.getFront());
}
}
|
Python3
MAX = 100
class Deque:
def __init__( self , size):
self .arr = [ 0 ] * MAX
self .front = - 1
self .rear = 0
self .size = size
def isFull( self ):
return (( self .front = = 0 and self .rear = = self .size - 1 ) or self .front = = self .rear + 1 )
def isEmpty( self ):
return ( self .front = = - 1 )
def insertfront( self , key):
if ( self .isFull()):
print ( "Overflow" )
return
if ( self .front = = - 1 ):
self .front = 0
self .rear = 0
elif ( self .front = = 0 ):
self .front = self .size - 1
else :
self .front = self .front - 1
self .arr[ self .front] = key
def insertrear( self , key):
if ( self .isFull()):
print ( " Overflow" )
return
if ( self .front = = - 1 ):
self .front = 0
self .rear = 0
elif ( self .rear = = self .size - 1 ):
self .rear = 0
else :
self .rear = self .rear + 1
self .arr[ self .rear] = key
def deletefront( self ):
if ( self .isEmpty()):
print ( "Queue Underflow" )
return
if ( self .front = = self .rear):
self .front = - 1
self .rear = - 1
else :
if ( self .front = = self .size - 1 ):
self .front = 0
else :
self .front = self .front + 1
def deleterear( self ):
if ( self .isEmpty()):
print ( " Underflow" )
return
if ( self .front = = self .rear):
self .front = - 1
self .rear = - 1
elif ( self .rear = = 0 ):
self .rear = self .size - 1
else :
self .rear = self .rear - 1
def getFront( self ):
if ( self .isEmpty()):
print ( " Underflow" )
return - 1
return self .arr[ self .front]
def getRear( self ):
if ( self .isEmpty() or self .rear < 0 ):
print ( " Underflow" )
return - 1
return self .arr[ self .rear]
if __name__ = = "__main__" :
dq = Deque( 5 )
print ( "Insert element at rear end : 5 " )
dq.insertrear( 5 )
print ( "insert element at rear end : 10 " )
dq.insertrear( 10 )
print (f "get rear element : {dq.getRear()}" )
dq.deleterear()
print (f "After delete rear element new rear become : {dq.getRear()}" )
print ( "inserting element at front end" )
dq.insertfront( 15 )
print (f "get front element: {dq.getFront()}" )
dq.deletefront()
print (f "After delete front element new front become : {dq.getFront()}" )
|
C#
using System;
public class Deque {
static readonly int MAX = 100;
int [] arr;
int front;
int rear;
int size;
public Deque( int size)
{
arr = new int [MAX];
front = -1;
rear = 0;
this .size = size;
}
bool isFull()
{
return ((front == 0 && rear == size - 1)
|| front == rear + 1);
}
bool isEmpty() { return (front == -1); }
void insertfront( int key)
{
if (isFull()) {
Console.WriteLine( "Overflow" );
return ;
}
if (front == -1) {
front = 0;
rear = 0;
}
else if (front == 0)
front = size - 1;
else
front = front - 1;
arr[front] = key;
}
void insertrear( int key)
{
if (isFull()) {
Console.WriteLine( " Overflow " );
return ;
}
if (front == -1) {
front = 0;
rear = 0;
}
else if (rear == size - 1)
rear = 0;
else
rear = rear + 1;
arr[rear] = key;
}
void deletefront()
{
if (isEmpty()) {
Console.WriteLine( "Queue Underflow\n" );
return ;
}
if (front == rear) {
front = -1;
rear = -1;
}
else
if (front == size - 1)
front = 0;
else
front = front + 1;
}
void deleterear()
{
if (isEmpty()) {
Console.WriteLine( " Underflow" );
return ;
}
if (front == rear) {
front = -1;
rear = -1;
}
else if (rear == 0)
rear = size - 1;
else
rear = rear - 1;
}
int getFront()
{
if (isEmpty()) {
Console.WriteLine( " Underflow" );
return -1;
}
return arr[front];
}
int getRear()
{
if (isEmpty() || rear < 0) {
Console.WriteLine( " Underflow\n" );
return -1;
}
return arr[rear];
}
public static void Main(String[] args)
{
Deque dq = new Deque(5);
Console.WriteLine(
"Insert element at rear end : 5 " );
dq.insertrear(5);
Console.WriteLine(
"insert element at rear end : 10 " );
dq.insertrear(10);
Console.WriteLine( "get rear element : "
+ dq.getRear());
dq.deleterear();
Console.WriteLine(
"After delete rear element new rear become : "
+ dq.getRear());
Console.WriteLine( "inserting element at front end" );
dq.insertfront(15);
Console.WriteLine( "get front element: "
+ dq.getFront());
dq.deletefront();
Console.WriteLine(
"After delete front element new front become : "
+ +dq.getFront());
}
}
|
Javascript
<script>
let MAX = 100;
class Deque
{
constructor(size)
{
this .arr = new Array(MAX);
this .front = -1;
this .rear = 0;
this .size = size;
}
isFull()
{
return (( this .front == 0 && this .rear == this .size-1)||
this .front == this .rear+1);
}
isEmpty ()
{
return ( this .front == -1);
}
insertfront(key)
{
if ( this .isFull())
{
document.write( "Overflow<br>" );
return ;
}
if ( this .front == -1)
{
this .front = 0;
this .rear = 0;
}
else if ( this .front == 0)
this .front = this .size - 1 ;
else
this .front = this .front-1;
this .arr[ this .front] = key ;
}
insertrear(key)
{
if ( this .isFull())
{
document.write( " Overflow <br>" );
return ;
}
if ( this .front == -1)
{
this .front = 0;
this .rear = 0;
}
else if ( this .rear == this .size-1)
this .rear = 0;
else
this .rear = this .rear+1;
this .arr[ this .rear] = key ;
}
deletefront()
{
if ( this .isEmpty())
{
document.write( "Queue Underflow<br>" );
return ;
}
if ( this .front == this .rear)
{
this .front = -1;
this .rear = -1;
}
else
if ( this .front == this .size -1)
this .front = 0;
else
this .front = this .front+1;
}
deleterear()
{
if ( this .isEmpty())
{
document.write( " Underflow<br>" );
return ;
}
if ( this .front == this .rear)
{
this .front = -1;
this .rear = -1;
}
else if ( this .rear == 0)
this .rear = this .size-1;
else
this .rear = this .rear-1;
}
getFront()
{
if ( this .isEmpty())
{
document.write( " Underflow<br>" );
return -1 ;
}
return this .arr[ this .front];
}
getRear()
{
if ( this .isEmpty() || this .rear < 0)
{
document.write( " Underflow<br>" );
return -1 ;
}
return this .arr[ this .rear];
}
}
let dq = new Deque(5);
document.write( "Insert element at rear end : 5 <br>" );
dq.insertrear(5);
document.write( "insert element at rear end : 10 <br>" );
dq.insertrear(10);
document.write( "get rear element : " + dq.getRear()+ "<br>" );
dq.deleterear();
document.write( "After delete rear element new rear become : " +
dq.getRear()+ "<br>" );
document.write( "inserting element at front end<br>" );
dq.insertfront(15);
document.write( "get front element: " +dq.getFront()+ "<br>" );
dq.deletefront();
document.write( "After delete front element new front become : " +
+ dq.getFront()+ "<br>" );
</script>
|
Output
Insert element at rear end : 5
insert element at rear end : 10
get rear element 10
After delete rear element new rear become 5
inserting element at front end
get front element 15
After delete front element new front become 5
Time Complexity: O(N)
Auxiliary Space: O(N)
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
21 Sep, 2022
Like Article
Save Article