Table of Contents
Deque (or double-ended queue) is a data structure that allows us to add and remove items from both ends. It can be quite useful since it can be used as a stack or a queue.
How to implement an Array Deque?
Functionalities
The Deque data structure contains the following functionalities.
- isEmpty(): This method checks if the deque is empty.
- isFull(): It returns true if the deque is full.
- insertFront(): This function adds an item at the front of the deque.
- insertRear(): It inserts an item at the end.
- removeFront(): It removes an item from the start.
- removeRear(): This method deletes an item from the end.
- getFront(): It returns an item that is at the front.
- getRear(): It returns an element at the rear.
- getSize(): This method returns the length of the deque.
Let’s see how we can implement these functionalities using a circular array.
Since the deque is opened at both ends, we will have two variables to keep track of the front and the rear. Initially, we set front = -1 and rear = -1.

Deque is Empty
A deque is empty if the front and rear are equal to -1.
Deque is Full
If front = 0 and rear = n-1 or front = rear+1, then the deque is full. Here, n is the size of the deque.
Insert an Item at the Front
- First, we need to check if the deque is full. If it is, we cannot add more items to it, and therefore, we raise an error.
- If the deque is empty ( front = -1 and rear = -1), then we set front = 0 and rear = 0.
- If front=0, then we change the front to n-1.
- Otherwise, we set front – = -1.
Finally, we add an item at the updated front.


Insert an Item at the Rear
- If the deque is full, then we raise an error.
- If it is the first element to be inserted, we set front = 0 and rear = 0.
- If rear = n-1, then we move the rear to index 0.
- Otherwise, we increment the rear, i.e., rear += 1.
Then, we insert the new value at the rear.

Delete an Item from the Front
- Here, we raise an error if the deque is empty.
- If the front=rear, then it is the last item in the deque. Therefore, we set front =-1 and rear =-1.
- If the front = n-1, then we change its position to 0.
- Otherwise, we increment the front.
Finally, the value of the deleted item gets returned.

Delete an Item from the rear
- If there are no items in the deque, an error gets raised.
- If the deque has only one item, then we reset the deque, i.e., front =-1 and rear =-1.
- We change the location of the rear to
n-1if it is at index 0. - Otherwise, we decrement the rear.
The deleted element gets returned at the end.

Code
Consider the following code that implements deque using a circular array.
class Deque:
def __init__(self, size):
self.size = size
self.array = [None]*self.size
self.front = -1
self.rear = -1
def isEmpty(self):
if (self.front==-1 and self.rear==-1):
return True
else:
return False
def isFull(self):
if ((self.front==0 and self.rear==self.size-1) or (self.front==self.rear+1)):
return True
else:
return False
def insertFront(self, value):
if (self.isFull()):
raise Exception("Error: Cannot insert to a full deque")
elif (self.isEmpty()): #adding to a empty deque
self.rear=0
self.front=0
elif (self.front==0):
self.front = self.size-1
else:
self.front -=1
self.array[self.front] = value
def insertRear(self, value):
if (self.isFull()):
raise Exception("Error: Cannot insert to a full deque")
elif (self.isEmpty()): #adding to a empty deque
self.rear=0
self.front=0
elif (self.rear==self.size-1):
self.rear = 0
else:
self.rear +=1
self.array[self.rear] = value
def removeFront(self):
if (self.isEmpty()):
raise Exception("Error: Cannot delete from an empty deque")
elif (self.front==self.rear): #last item
value=self.array[self.front]
self.array[self.front] = None
self.front=-1
self.rear=-1
elif (self.front==self.size-1):
value=self.array[self.front]
self.array[self.front] = None
self.front=0
else:
value=self.array[self.front]
self.array[self.front] = None
self.front += 1
return value
def removeRear(self):
if (self.isEmpty()):
raise Exception("Error: Cannot delete from an empty deque")
elif (self.front==self.rear): #last item
value=self.array[self.rear]
self.array[self.rear] = None
self.front=-1
self.rear=-1
elif (self.rear==0):
value=self.array[self.rear]
self.array[self.rear] = None
self.rear=self.size-1
else:
value=self.array[self.rear]
self.array[self.rear] = None
self.rear -= 1
return value
def getFront(self):
if (self.isEmpty()):
raise Exception("Error: Cannot access from an empty deque")
else:
return self.array[self.front]
def getRear(self):
if (self.isEmpty()):
raise Exception("Error: Cannot access from an empty deque")
else:
return self.array[self.rear]
def getSize(self):
return self.size
d = Deque(4) #[None, None, None, None]
d.insertFront(3) #[3, None, None, None]
d.insertRear(4) #[3, 4, None, None]
d.insertFront(5) #[3, 4, None, 5]
d.insertRear(6) #[3, 4, 6, 5]
print("Deleted Item:", d.removeFront()) #[3, 4, 6, None]
print("Deleted Item:", d.removeRear()) #[3, 4, None, None]
print("Item at front:", d.getFront())
print("Item at rear:", d.getRear())
Output
Deleted Item: 5
Deleted Item: 6
Item at front: 3
Item at rear: 4
