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
- A queue is a linear data structure that follows FIFO (First-In-First-Out) principle
- First element inserted is the first one to be removed
- 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
- Queue follows FIFO principle
- Can be implemented using arrays or linked lists
- Operations:
enqueue, dequeue, peek, isEmpty, isFull - Array-based queue has fixed size, linked-list queue is dynamic
- Useful in process scheduling, printer queues, BFS algorithms