Queue Data Structure in C (Complete Guide with Examples)


This tutorial explains the Queue data structure in C, a First-In-First-Out (FIFO) structure. It covers concepts, operations (enqueue, dequeue, peek), array and linked list implementations, and practical examples to improve problem-solving skills.

1. What is a Queue

  1. A queue is a linear data structure that follows FIFO (First-In-First-Out) principle
  2. First element inserted is the first one to be removed
  3. Common examples: printer queue, call center waiting list, CPU scheduling

2. Queue Operations

OperationDescription
enqueue()Insert element at the rear of the queue
dequeue()Remove element from the front of the queue
peek()Get front element without removing
isEmpty()Check if queue is empty
isFull()Check if queue is full (for array implementation)

3. Queue Implementation Using Array


#include <stdio.h>
#define MAX 5

int queue[MAX];
int front = -1, rear = -1;

void enqueue(int x) {
if(rear == MAX - 1) {
printf("Queue Overflow\n");
return;
}
if(front == -1) front = 0;
queue[++rear] = x;
printf("%d enqueued to queue\n", x);
}

void dequeue() {
if(front == -1 || front > rear) {
printf("Queue Underflow\n");
return;
}
printf("%d dequeued from queue\n", queue[front++]);
if(front > rear) front = rear = -1; // reset queue
}

void peek() {
if(front == -1) {
printf("Queue is empty\n");
} else {
printf("Front element: %d\n", queue[front]);
}
}

int main() {
enqueue(10);
enqueue(20);
enqueue(30);

peek();
dequeue();
peek();

return 0;
}

Sample Output:


10 enqueued to queue
20 enqueued to queue
30 enqueued to queue
Front element: 10
10 dequeued from queue
Front element: 20

4. Queue Implementation Using Linked List


#include <stdio.h>
#include <stdlib.h>

struct Node {
int data;
struct Node *next;
};

struct Node *front = NULL, *rear = NULL;

void enqueue(int x) {
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = x;
newNode->next = NULL;
if(rear == NULL) {
front = rear = newNode;
} else {
rear->next = newNode;
rear = newNode;
}
printf("%d enqueued to queue\n", x);
}

void dequeue() {
if(front == NULL) {
printf("Queue Underflow\n");
return;
}
struct Node *temp = front;
front = front->next;
printf("%d dequeued from queue\n", temp->data);
free(temp);
if(front == NULL) rear = NULL;
}

void peek() {
if(front == NULL) {
printf("Queue is empty\n");
} else {
printf("Front element: %d\n", front->data);
}
}

int main() {
enqueue(10);
enqueue(20);
enqueue(30);

peek();
dequeue();
peek();

return 0;
}

Sample Output:


10 enqueued to queue
20 enqueued to queue
30 enqueued to queue
Front element: 10
10 dequeued from queue
Front element: 20

5. Key Points to Remember

  1. Queue follows FIFO principle
  2. Can be implemented using arrays or linked lists
  3. Operations: enqueue, dequeue, peek, isEmpty, isFull
  4. Array-based queue has fixed size, linked-list queue is dynamic
  5. Useful in process scheduling, printer queues, BFS algorithms