#define MAX 5
typedef struct DQ
{
    int     front	;
    int     rear	;
    int     count	;
    int     ele[MAX];
};
             
            
#define MAX 5
//Declaration of DQueue
class DQueue
{
	private:
		int front	;
		int rear	;
		int count	;
		int ele[MAX]	;
	public:
		DQueue();
		int  isFull();
		int  isEmpty();
		void insertDQueueAtRear(int item);
		int  deleteDQueueAtFont(int *item);
		void insertDQueueAtFront(int item);
		int  deleteDQueueAtRear(int *item);
};
             
         
        
            
#include <stdio.h>
#define MAX 5
//Declaration of Dequeue.
typedef struct
{
	int front	;
	int rear	;
	int count	;
	int ele[MAX]	;
}DQueue;
//Initailization of Dequeue.
void initDQueue(DQueue * q)
{
	q->front =  0;
	q->rear  = -1;
	q->count =  0;
}
//Check Dequeue is full or not
int isFull(DQueue * q)
{
	int full=0;
	
	if(q->count == MAX)
		full = 1;	
	return full;
}
//Check Dequeue is empty or not
int isEmpty(DQueue * q)
{
	int empty=0;
	
	if(q->count == 0)
		empty = 1;	
	return empty;
}
//To insert item into Dequeue at rear.
void insertDQueueAtRear(DQueue * q, int item)
{
	if( isFull(q) )
	{
		printf("\nQueue Overflow");
		return;
	}
	
	q->rear = (q->rear+1)%MAX;
	q->ele[q->rear] = item;
	
	q->count++;
 
	printf("\nAfter insert At Rear FRONT : %d, REAR : %d",q->front,q->rear);
	printf("\nInserted item : %d\n",item);
}
//To delete item from Dequeue at front.
int deleteDQueueAtFront(DQueue * q, int *item)
{
	if( isEmpty(q) )
	{
		printf("\nQueue Underflow");
		return -1;
	}
	*item    = q->ele[q->front];
	q->front = (q->front+1)%MAX;
	
	q->count--;
	printf("\nAfter Delete At Front FRONT : %d, REAR : %d",q->front,q->rear);
	return 0;
}
//To insert item into Dequeue at front.
void insertDQueueAtFront(DQueue * q, int item)
{
	if( isFull(q) )
	{
		printf("\nQueue Overflow");
		return;
	}
	
	if ( q->front == 0)
		q->front = MAX - 1;
	else
		q->front = q->front - 1;
	q->ele[q->front] = item;
	
	q->count++;
	printf("\nAfter Insert At Front FRONT : %d, REAR : %d",q->front,q->rear);
	printf("\nInserted item : %d\n",item);
}
//To delete item from Dequeue at rear.
int deleteDQueueAtRear(DQueue * q, int *item)
{
	if( isEmpty(q) )
	{
		printf("\nQueue Underflow");
		return -1;
	}
	*item = q->ele[q->rear];
	if(q->rear == 0)
		q->rear = MAX - 1;
	else
		q->rear = q->rear - 1;
	printf("\nAfterDeleteAtRear FRONT : %d, REAR : %d",q->front,q->rear);
	q->count--;	
	return 0;
}
int main()
{
	int item=0;
	DQueue q;
	initDQueue(&q);
	insertDQueueAtRear(&q, 10);	
	insertDQueueAtRear(&q, 20);
	insertDQueueAtRear(&q, 30);
	insertDQueueAtFront(&q, 40);
	insertDQueueAtFront(&q, 50);
	insertDQueueAtFront(&q, 60);
	if ( deleteDQueueAtFront( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	
	if ( deleteDQueueAtFront( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	
	if ( deleteDQueueAtFront( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	
	if ( deleteDQueueAtRear( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	
	if ( deleteDQueueAtRear( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	
	
	if ( deleteDQueueAtRear( &q, &item ) == 0 )
		printf("\nDeleted item is : %d\n",item);
	printf("\n");
	return 0;	
}
    After insertAtRear FRONT : 0, REAR : 0
    Inserted item : 10
    After insertAtRear FRONT : 0, REAR : 1
    Inserted item : 20
    After insertAtRear FRONT : 0, REAR : 2
    Inserted item : 30
    AfterInsertAtFront FRONT : 4, REAR : 2
    Inserted item : 40
    AfterInsertAtFront FRONT : 3, REAR : 2
    Inserted item : 50
    Queue Overflow
    AfterDeleteAtFront FRONT : 4, REAR : 2
    Deleted item is : 50
    AfterDeleteAtFront FRONT : 0, REAR : 2
    Deleted item is : 40
    AfterDeleteAtFront FRONT : 1, REAR : 2
    Deleted item is : 10
    AfterDeleteAtRear FRONT : 1, REAR : 1
    Deleted item is : 30
    AfterDeleteAtRear FRONT : 1, REAR : 0
    Deleted item is : 20
    Queue Underflow
             
            
#include <iostream>
using namespace std;
#define MAX 5
//Declaration of DQueue
class DQueue
{
	private:
		int front	;
		int rear	;
		int count	;
		int ele[MAX]	;
	public:
		DQueue();
		int  isFull();
		int  isEmpty();
		void insertDQueueAtRear(int item);
		int  deleteDQueueAtFont(int *item);
		void insertDQueueAtFront(int item);
		int  deleteDQueueAtRear(int *item);
};
//Initalize DQueue
DQueue:: DQueue()
{
	front =  0;
	rear  = -1;
	count =  0;	
}
//To check DQueue is full or not
int DQueue:: isFull()
{
	int full=0;
	if( count == MAX )
		full = 1;
	return full;	
}
//To check DQueue is empty or not
int DQueue:: isEmpty()
{
	int empty=0;
	if( count == 0 )
		empty = 1;
	return empty;	
}
//Insert item into DQueue
void DQueue:: insertDQueueAtRear(int item)
{
	if( isFull() )
	{
		cout<<"\nQueue Overflow";
		return;
	}
	rear= (rear+1) % MAX;
	ele[rear] = item;
	count++;
	
	cout<<"\nAfterInsert At Rear FRONT : "<< front<<", REAR : "<< rear;
	cout<<"\nInserted item : "<< item << endl;
}
//Delete item from DQueue
int DQueue:: deleteDQueueAtFont(int *item)
{
	if( isEmpty() )
	{
		cout<<"\nQueue Underflow";
		return -1;
	}
	*item = ele[front];
	front = (front+1) % MAX;
	
	cout<<"\nAfter Delete At Front FRONT : "<< front<<", REAR : "<< rear;
	count--;
	return 0;
}
//To insert item into Dequeue at front.
void DQueue:: insertDQueueAtFront(int item)
{
	if( isFull() )
	{
		cout<<"\nQueue Overflow";
		return;
	}
	
	if ( front == 0)
		front = MAX - 1;
	else
		front = front - 1;
	ele[front] = item;
	
	count++;
	cout<<"\nAfter Insert At Front FRONT :"<< front<<", REAR : "<< rear;
	cout<<"\nInserted item : "<< item<< endl;
}
//To delete item from Dequeue at rear.
int DQueue:: deleteDQueueAtRear(int *item)
{
	if( isEmpty() )
	{
		cout<<"\nQueue Underflow";
		return -1;
	}
	*item = ele[rear];
	if(rear == 0)
		rear = MAX - 1;
	else
		rear = rear - 1;
	cout<<"\nAfterDeleteAtRear FRONT : "<< front<<", REAR : "<< rear;
	count--;	
	return 0;
}
int main()
{
	int  item;
	DQueue q = DQueue();
	q.insertDQueueAtRear(10);
	q.insertDQueueAtRear(20);
	q.insertDQueueAtRear(30);
	q.insertDQueueAtFront(40);
	q.insertDQueueAtFront(50);
	q.insertDQueueAtFront(60);
	if( q.deleteDQueueAtFont(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	if( q.deleteDQueueAtFont(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	if( q.deleteDQueueAtFont(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	if( q.deleteDQueueAtRear(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	if( q.deleteDQueueAtRear(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	
	if( q.deleteDQueueAtRear(&item) == 0 )
	{
		cout<<"\nDeleted item:"<< item<< endl;
	}
	cout<<"\n";
	return 0;
}
    AfterInsert At Rear FRONT : 0, REAR : 0
    Inserted item : 10
    AfterInsert At Rear FRONT : 0, REAR : 1
    Inserted item : 20
    AfterInsert At Rear FRONT : 0, REAR : 2
    Inserted item : 30
    After Insert At Front FRONT :4, REAR : 2
    Inserted item : 40
    After Insert At Front FRONT :3, REAR : 2
    Inserted item : 50
    Queue Overflow
    After Delete At Front FRONT : 4, REAR : 2
    Deleted item:50
    After Delete At Front FRONT : 0, REAR : 2
    Deleted item:40
    After Delete At Front FRONT : 1, REAR : 2
    Deleted item:10
    AfterDeleteAtRear FRONT : 1, REAR : 1
    Deleted item:30
    AfterDeleteAtRear FRONT : 1, REAR : 0
    Deleted item:20
    Queue Underflow