*77*

# Deque (or double-ended queue)

In this article, we will discuss the double-ended queue or deque. We should first see a brief description of the queue.

### What is a queue?

A queue is a data structure in which whatever comes first will go out first, and it follows the FIFO (First-In-First-Out) policy. Insertion in the queue is done from one end known as the **rear end** or the **tail,** whereas the deletion is done from another end known as the **front end** or the **head** of the queue.

The real-world example of a queue is the ticket queue outside a cinema hall, where the person who enters first in the queue gets the ticket first, and the person enters last in the queue gets the ticket at last.

### What is a Deque (or double-ended queue)

The deque stands for Double Ended Queue. Deque is a linear data structure where the insertion and deletion operations are performed from both ends. We can say that deque is a generalized version of the queue.

Though the insertion and deletion in a deque can be performed on both ends, it does not follow the FIFO rule. The representation of a deque is given as follows –

### Types of deque

There are two types of deque –

- Input restricted queue
- Output restricted queue

**Input restricted Queue**

In input restricted queue, insertion operation can be performed at only one end, while deletion can be performed from both ends.

**Output restricted Queue**

In output restricted queue, deletion operation can be performed at only one end, while insertion can be performed from both ends.

### Operations performed on deque

There are the following operations that can be applied on a deque –

- Insertion at front
- Insertion at rear
- Deletion at front
- Deletion at rear

We can also perform peek operations in the deque along with the operations listed above. Through peek operation, we can get the deque’s front and rear elements of the deque. So, in addition to the above operations, following operations are also supported in deque –

- Get the front item from the deque
- Get the rear item from the deque
- Check whether the deque is full or not
- Checks whether the deque is empty or not

Now, let’s understand the operation performed on deque using an example.

**Insertion at the front end**

In this operation, the element is inserted from the front end of the queue. Before implementing the operation, we first have to check whether the queue is full or not. If the queue is not full, then the element can be inserted from the front end by using the below conditions –

- If the queue is empty, both rear and front are initialized with 0. Now, both will point to the first element.
- Otherwise, check the position of the front if the front is less than 1 (front < 1), then reinitialize it by
**front = n – 1**, i.e., the last index of the array.

**Insertion at the rear end**

In this operation, the element is inserted from the rear end of the queue. Before implementing the operation, we first have to check again whether the queue is full or not. If the queue is not full, then the element can be inserted from the rear end by using the below conditions –

- If the queue is empty, both rear and front are initialized with 0. Now, both will point to the first element.
- Otherwise, increment the rear by 1. If the rear is at last index (or size – 1), then instead of increasing it by 1, we have to make it equal to 0.

**Deletion at the front end**

In this operation, the element is deleted from the front end of the queue. Before implementing the operation, we first have to check whether the queue is empty or not.

If the queue is empty, i.e., front = -1, it is the underflow condition, and we cannot perform the deletion. If the queue is not full, then the element can be inserted from the front end by using the below conditions –

If the deque has only one element, set rear = -1 and front = -1.

Else if front is at end (that means front = size – 1), set front = 0.

Else increment the front by 1, (i.e., front = front + 1).

**Deletion at the rear end**

In this operation, the element is deleted from the rear end of the queue. Before implementing the operation, we first have to check whether the queue is empty or not.

If the queue is empty, i.e., front = -1, it is the underflow condition, and we cannot perform the deletion.

If the deque has only one element, set rear = -1 and front = -1.

If rear = 0 (rear is at front), then set rear = n – 1.

Else, decrement the rear by 1 (or, rear = rear -1).

**Check empty**

This operation is performed to check whether the deque is empty or not. If front = -1, it means that the deque is empty.

**Check full**

This operation is performed to check whether the deque is full or not. If front = rear + 1, or front = 0 and rear = n – 1 it means that the deque is full.

The time complexity of all of the above operations of the deque is O(1), i.e., constant.

**Applications of deque**

- Deque can be used as both stack and queue, as it supports both operations.
- Deque can be used as a palindrome checker means that if we read the string from both ends, the string would be the same.

## Implementation of deque

Now, let’s see the implementation of deque in C programming language.

**Output:**

So, that’s all about the article. Hope, the article will be helpful and informative to you.