Before implementing a queue, we must know the basic operations that should be available for a queue.
Main Queue Operations:-
- enQueue(int data) :- Inserts an element at the end of the queue.
- int deQueue():- Removes and returns the element at the front of the queue.
Auxiliary Queue Operations:-
- int front():- Returns the first element at the queue, without removing it.
- int queueSize():- Returns the size of the queue.
- int isEmptyQueue():- Indicates whether no elements are present.
We can implement a queue using an ADT (Abstract Data Type). To implement a queue, we can use the structure for the node of a Linked List:-
struct node
{
int data;
struct node * next;
};
Further, a Queue is represented by a front end and a rear end. Thus, we can extend the data structure of the Linked List node to use it in our queue.
struct queue
{
struct node * front;
struct node * rear;
};
Now, to ENQUEUE, we need to add a node to the original queue. If the queue is initially NULL, we need to allocate new memory and assign the value to a node and update the FRONT and REAR. However, if the queue is already full, we need to add a new node at the REAR and then update the REAR pointer of the queue.
//implementing a function to EnQueue an element
struct queue * enQueue(struct queue * q, int num)
{
//creating a node to add
struct node * temp = (struct node*)malloc(sizeof(struct node));
temp -> data = num;
temp -> next = NULL;
//check if the queue is NULL
if(q==NULL)
{
q = (struct queue*)malloc(sizeof(struct queue));
//overflow check
if(!q)
{
printf("OVERFLOW EXCEPTION");
return NULL;
}
//here we need to update the FRONT pointer
q -> front = temp;
}
else
{
//We assign the NEXT of last node to the temp node we created
q -> rear -> next = temp;
}
//We need to update the REAR pointer in both the cases
q -> rear = temp;
//return the FRONT
return q;
}
The DEQUEUE, operation involves to print the FRONT of the node and then UPDATE the FRONT pointer. Printing the value is totally optional.
//implementing a DEQUEUE operation
struct queue * deQueue(struct queue * q)
{
//underflow check
if(q == NULL)
{
printf("UNDERFLOW EXCEPTION\n");
return NULL;
}
printf("The element dequeued is:- %d\n",q->front->data);
struct queue * temp = q->front;
//We need to update the FRONT pointer
q -> front = q->front->next;
//free the memory
free(temp);
return q;
}
The print operation of the queue can also be implemented as follows.
void printer(struct queue * q)
{
struct node * x = q->front;
while(x != NULL)
{
printf("%d ",x->data);
x = x->next;
}
}
A working demo of the program can be downloaded here containing the main function as well. Use your favorite editor like gEdit, Notepad++, vim to open it.
