1. Queue Using Array (Linear Queue)
// C Program to implement queue using arrays
#include <stdio.h>
// Define the maximum size for the queue
#define MAX_SIZE 100
// Define a structure for the queue
struct Queue {
int queue[MAX_SIZE];
int front;
int rear;
};
// Function to initialize the queue
void initializeQueue(struct Queue *q) {
q->front = -1;
q->rear = -1;
}
// Function to check if the queue is empty
int isEmpty(struct Queue *q) {
return (q->front == -1);
}
// Function to check if the queue is full
int isFull(struct Queue *q) {
return (q->rear == MAX_SIZE - 1);
}
// Function to insert an element into the queue
void enqueue(struct Queue *q, int data) {
if (isFull(q)) {
printf("Queue is full\n");
return;
}
if (isEmpty(q)) {
q->front = 0;
}
q->rear++;
q->queue[q->rear] = data;
printf("Enqueued %d in queue\n", data);
}
// Function to remove an element from the queue
int dequeue(struct Queue *q) {
if (isEmpty(q)) {
printf("Queue is empty\n");
return -1;
}
int data = q->queue[q->front];
// If the queue is empty reset the pointers
if (q->front == q->rear) {
q->front = -1;
q->rear = -1;
} else {
q->front++;
}
printf("Deleted element: %d\n", data);
return data;
}
// Function to display the elements of the queue
void display(struct Queue *q) {
if (isEmpty(q)) {
printf("Queue is empty\n");
return;
}
for (int i = q->front; i <= q->rear; i++) {
printf("%d ", q->queue[i]);
}
printf("\n");
}
int main() {
// Initialize a queue
struct Queue q;
initializeQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
printf("Elements in the queue after enqueue operation: ");
display(&q);
dequeue(&q);
printf("Elements in the queue after dequeue operation: ");
display(&q);
return 0;
}
Output:
2. Queue using Linked List
#include <stdio.h>
#include <stdlib.h>
// Node structure definition
struct Node {
int data;
struct Node* next;
};
// Queue structure definition
struct Queue {
struct Node* front;
struct Node* rear;
};
// Function to create a new node
struct Node* newNode(int new_data) {
struct Node* node = (struct Node*)malloc(sizeof(struct Node));
node->data = new_data;
node->next = NULL;
return node;
}
// Function to initialize the queue
struct Queue* createQueue() {
struct Queue* q = (struct Queue*)malloc(sizeof(struct Queue));
q->front = q->rear = NULL;
return q;
}
// Function to check if the queue is empty
int isEmpty(struct Queue* q) {
return q->front == NULL;
}
// Function to print the current state of the queue
void printQueue(struct Queue* q) {
if (isEmpty(q)) {
printf("Queue is empty\n");
return;
}
struct Node* temp = q->front;
printf("Current Queue: ");
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// Function to add an element to the queue
void enqueue(struct Queue* q, int new_data) {
struct Node* new_node = newNode(new_data);
if (isEmpty(q)) {
q->front = q->rear = new_node;
} else {
q->rear->next = new_node;
q->rear = new_node;
}
printQueue(q);
}
// Function to remove an element from the queue
void dequeue(struct Queue* q) {
if (isEmpty(q)) {
printf("Cannot dequeue. Queue is empty.\n");
return;
}
struct Node* temp = q->front;
q->front = q->front->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
printQueue(q);
}
// Driver code to test the queue implementation
int main() {
struct Queue* q = createQueue();
// Enqueue elements into the queue
enqueue(q, 10);
enqueue(q, 20);
// Dequeue elements from the queue
dequeue(q);
dequeue(q);
// Enqueue more elements into the queue
enqueue(q, 30);
enqueue(q, 40);
enqueue(q, 50);
// Dequeue an element from the queue
dequeue(q);
return 0;
}
return q->front == NULL;
}
// Add an element to the queue (enqueue)
void linkedListEnqueue(LinkedListQueue *q, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = NULL;
if (isLinkedListQueueEmpty(q)) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
printf("Enqueued %d\n", value);
}
// Remove an element from the queue (dequeue)
int linkedListDequeue(LinkedListQueue *q) {
if (isLinkedListQueueEmpty(q)) {
printf("Queue is empty. Cannot dequeue.\n");
return -1;
}
Node *temp = q->front;
int item = temp->data;
q->front = q->front->next;
// If queue becomes empty
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
printf("Dequeued %d\n", item);
return item;
}
// Display the queue
void displayLinkedListQueue(LinkedListQueue *q) {
if (isLinkedListQueueEmpty(q)) {
printf("Queue is empty.\n");
return;
}
printf("Queue elements: ");
Node *current = q->front;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
// Free memory when done
void freeLinkedListQueue(LinkedListQueue *q) {
while (!isLinkedListQueueEmpty(q)) {
linkedListDequeue(q);
}
}
Output:
Comments
Post a Comment