Data Structures and Algorithms Tutorials | IT Developer
IT Developer

Data Structures & Algorithms - Queue Algorithm



Share with a Friend

Queue Algorithm

A Queue is a linear data structure that follows the FIFO (First In, First Out) principle. The element inserted first is the one to be removed first.

🔹 Basic Operations in Queue

  1. Enqueue – Insert an element at the rear.
  2. Dequeue – Remove an element from the front.
  3. Front (Peek) – Get the front element.
  4. isEmpty – Check if the queue is empty.
  5. isFull – (For static queue) Check if the queue is full.

🔹 Real-World Examples

  • Ticketing systems
  • Printer queue
  • Call center phone lines
  • OS scheduling (e.g., Round Robin)

✅ Queue Implementation using Array - C, C++, Java, Python

 

#include <stdio.h>

#define SIZE 5

 

int queue[SIZE];

int front = -1, rear = -1;

 

void enqueue(int val) {

    if (rear == SIZE - 1) {

        printf("Queue Overflow\n");

        return;

    }

    if (front == -1) front = 0;

    queue[++rear] = val;

}

 

void dequeue() {

    if (front == -1 || front > rear) {

        printf("Queue Underflow\n");

        return;

    }

    printf("Dequeued: %d\n", queue[front++]);

}

 

void display() {

    if (front == -1 || front > rear) {

        printf("Queue is empty\n");

        return;

    }

    printf("Queue: ");

    for (int i = front; i <= rear; i++)

        printf("%d ", queue[i]);

    printf("\n");

}

 

int main() {

    enqueue(10); enqueue(20); enqueue(30);

    display();

    dequeue();

    display();

    return 0;

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

#include <iostream>

#define SIZE 5

using namespace std;

 

class Queue {

    int arr[SIZE];

    int front, rear;

 

public:

    Queue() {

        front = -1;

        rear = -1;

    }

 

    void enqueue(int val) {

        if (rear == SIZE - 1) {

            cout << "Queue Overflow\n";

            return;

        }

        if (front == -1) front = 0;

        arr[++rear] = val;

    }

 

    void dequeue() {

        if (front == -1 || front > rear) {

            cout << "Queue Underflow\n";

            return;

        }

        cout << "Dequeued: " << arr[front++] << endl;

    }

 

    void display() {

        if (front == -1 || front > rear) {

            cout << "Queue is empty\n";

            return;

        }

        cout << "Queue: ";

        for (int i = front; i <= rear; i++)

            cout << arr[i] << " ";

        cout << endl;

    }

};

 

int main() {

    Queue q;

    q.enqueue(10); q.enqueue(20); q.enqueue(30);

    q.display();

    q.dequeue();

    q.display();

    return 0;

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

public class ArrayQueue {

    static final int SIZE = 5;

    int[] queue = new int[SIZE];

    int front = -1, rear = -1;

 

    void enqueue(int val) {

        if (rear == SIZE - 1) {

            System.out.println("Queue Overflow");

            return;

        }

        if (front == -1) front = 0;

        queue[++rear] = val;

    }

 

    void dequeue() {

        if (front == -1 || front > rear) {

            System.out.println("Queue Underflow");

            return;

        }

        System.out.println("Dequeued: " + queue[front++]);

    }

 

    void display() {

        if (front == -1 || front > rear) {

            System.out.println("Queue is empty");

            return;

        }

        System.out.print("Queue: ");

        for (int i = front; i <= rear; i++)

            System.out.print(queue[i] + " ");

        System.out.println();

    }

 

    public static void main(String[] args) {

        ArrayQueue q = new ArrayQueue();

        q.enqueue(10); q.enqueue(20); q.enqueue(30);

        q.display();

        q.dequeue();

        q.display();

    }

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

SIZE = 5

queue = [None] * SIZE

front = -1

rear = -1

 

def enqueue(val):

    global rear, front

    if rear == SIZE - 1:

        print("Queue Overflow")

        return

    if front == -1:

        front = 0

    rear += 1

    queue[rear] = val

 

def dequeue():

    global front

    if front == -1 or front > rear:

        print("Queue Underflow")

        return

    print("Dequeued:", queue[front])

    front += 1

 

def display():

    if front == -1 or front > rear:

        print("Queue is empty")

    else:

        print("Queue:", queue[front:rear+1])

 

# Test

enqueue(10)

enqueue(20)

enqueue(30)

display()

dequeue()

display()

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

✅ Queue Implementation using Linked List - C, C++, Java, Python

 

Queue Implementation using Linked List in C, C++, Java, and Python, including the key operations: enqueue, dequeue, and display.

#include <stdio.h>

#include <stdlib.h>

 

struct Node {

    int data;

    struct Node* next;

};

 

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

 

void enqueue(int val) {

    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));

    temp->data = val;

    temp->next = NULL;

    if (rear == NULL) {

        front = rear = temp;

        return;

    }

    rear->next = temp;

    rear = temp;

}

 

void dequeue() {

    if (front == NULL) {

        printf("Queue Underflow\n");

        return;

    }

    struct Node* temp = front;

    front = front->next;

    if (front == NULL) rear = NULL;

    printf("Dequeued: %d\n", temp->data);

    free(temp);

}

 

void display() {

    struct Node* temp = front;

    if (!temp) {

        printf("Queue is empty\n");

        return;

    }

    printf("Queue: ");

    while (temp) {

        printf("%d ", temp->data);

        temp = temp->next;

    }

    printf("\n");

}

 

int main() {

    enqueue(10);

    enqueue(20);

    enqueue(30);

    display();

    dequeue();

    display();

    return 0;

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

#include <iostream>

using namespace std;

 

struct Node {

    int data;

    Node* next;

};

 

class Queue {

    Node *front, *rear;

 

public:

    Queue() {

        front = rear = nullptr;

    }

 

    void enqueue(int val) {

        Node* temp = new Node{val, nullptr};

        if (!rear) {

            front = rear = temp;

            return;

        }

        rear->next = temp;

        rear = temp;

    }

 

    void dequeue() {

        if (!front) {

            cout << "Queue Underflow\n";

            return;

        }

        Node* temp = front;

        front = front->next;

        if (!front) rear = nullptr;

        cout << "Dequeued: " << temp->data << endl;

        delete temp;

    }

 

    void display() {

        if (!front) {

            cout << "Queue is empty\n";

            return;

        }

        Node* temp = front;

        cout << "Queue: ";

        while (temp) {

            cout << temp->data << " ";

            temp = temp->next;

        }

        cout << endl;

    }

};

 

int main() {

    Queue q;

    q.enqueue(10);

    q.enqueue(20);

    q.enqueue(30);

    q.display();

    q.dequeue();

    q.display();

    return 0;

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

class Node {

    int data;

    Node next;

    Node(int d) {

        data = d;

        next = null;

    }

}

 

class Queue {

    Node front, rear;

 

    public void enqueue(int val) {

        Node temp = new Node(val);

        if (rear == null) {

            front = rear = temp;

            return;

        }

        rear.next = temp;

        rear = temp;

    }

 

    public void dequeue() {

        if (front == null) {

            System.out.println("Queue Underflow");

            return;

        }

        System.out.println("Dequeued: " + front.data);

        front = front.next;

        if (front == null) rear = null;

    }

 

    public void display() {

        if (front == null) {

            System.out.println("Queue is empty");

            return;

        }

        System.out.print("Queue: ");

        Node temp = front;

        while (temp != null) {

            System.out.print(temp.data + " ");

            temp = temp.next;

        }

        System.out.println();

    }

 

    public static void main(String[] args) {

        Queue q = new Queue();

        q.enqueue(10);

        q.enqueue(20);

        q.enqueue(30);

        q.display();

        q.dequeue();

        q.display();

    }

}

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

class Node:

    def __init__(self, data):

        self.data = data

        self.next = None

 

class Queue:

    def __init__(self):

        self.front = self.rear = None

 

    def enqueue(self, val):

        temp = Node(val)

        if self.rear is None:

            self.front = self.rear = temp

            return

        self.rear.next = temp

        self.rear = temp

 

    def dequeue(self):

        if self.front is None:

            print("Queue Underflow")

            return

        print("Dequeued:", self.front.data)

        self.front = self.front.next

        if self.front is None:

            self.rear = None

 

    def display(self):

        if self.front is None:

            print("Queue is empty")

            return

        temp = self.front

        print("Queue:", end=" ")

        while temp:

            print(temp.data, end=" ")

            temp = temp.next

        print()

 

# Test

q = Queue()

q.enqueue(10)

q.enqueue(20)

q.enqueue(30)

q.display()

q.dequeue()

q.display()

Output

Queue: 10 20 30

Dequeued: 10

Queue: 20 30

✅ Circular Queue Implementation - C, C++, Java, Python

 

#include <stdio.h>

#define SIZE 5

 

int queue[SIZE];

int front = -1, rear = -1;

 

void enqueue(int value) {

    if ((rear + 1) % SIZE == front) {

        printf("Queue is Full\n");

    } else {

        if (front == -1) front = 0;

        rear = (rear + 1) % SIZE;

        queue[rear] = value;

        printf("Inserted %d\n", value);

    }

}

 

void dequeue() {

    if (front == -1) {

        printf("Queue is Empty\n");

    } else {

        printf("Deleted: %d\n", queue[front]);

        if (front == rear) front = rear = -1;

        else front = (front + 1) % SIZE;

    }

}

 

void display() {

    if (front == -1) {

        printf("Queue is Empty\n");

        return;

    }

    int i = front;

    printf("Queue: ");

    while (1) {

        printf("%d ", queue[i]);

        if (i == rear) break;

        i = (i + 1) % SIZE;

    }

    printf("\n");

}

 

int main() {

    enqueue(10); enqueue(20); enqueue(30);

    display();

    dequeue(); dequeue();

    display();

    enqueue(40); enqueue(50); enqueue(60);

    display();

    return 0;

}

Output

Inserted: 10
Inserted: 20
Inserted: 30
Queue: 10 20 30 
Deleted: 10
Deleted: 20
Queue: 30 
Inserted: 40
Inserted: 50
Inserted: 60
Queue: 30 40 50 60 

//C++ Program – Circular Queue using Array

#include <iostream>

#define SIZE 5

using namespace std;

 

class CircularQueue {

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

public:

    void enqueue(int value) {

        if ((rear + 1) % SIZE == front) {

            cout << "Queue is Full\n";

        } else {

            if (front == -1) front = 0;

            rear = (rear + 1) % SIZE;

            queue[rear] = value;

            cout << "Inserted: " << value << endl;

        }

    }

 

    void dequeue() {

        if (front == -1) {

            cout << "Queue is Empty\n";

        } else {

            cout << "Deleted: " << queue[front] << endl;

            if (front == rear) front = rear = -1;

            else front = (front + 1) % SIZE;

        }

    }

 

    void display() {

        if (front == -1) {

            cout << "Queue is Empty\n";

            return;

        }

        int i = front;

        cout << "Queue: ";

        while (true) {

            cout << queue[i] << " ";

            if (i == rear) break;

            i = (i + 1) % SIZE;

        }

        cout << endl;

    }

};

 

int main() {

    CircularQueue q;

    q.enqueue(10); q.enqueue(20); q.enqueue(30);

    q.display();

    q.dequeue(); q.dequeue();

    q.display();

    q.enqueue(40); q.enqueue(50); q.enqueue(60);

    q.display();

    return 0;

}

Output

Inserted: 10
Inserted: 20
Inserted: 30
Queue: 10 20 30 
Deleted: 10
Deleted: 20
Queue: 30 
Inserted: 40
Inserted: 50
Inserted: 60
Queue: 30 40 50 60 

// Java Program – Circular Queue using Array

class CircularQueue {

    int SIZE = 5;

    int[] queue = new int[SIZE];

    int front = -1, rear = -1;

 

    void enqueue(int value) {

        if ((rear + 1) % SIZE == front) {

            System.out.println("Queue is Full");

        } else {

            if (front == -1) front = 0;

            rear = (rear + 1) % SIZE;

            queue[rear] = value;

            System.out.println("Inserted: " + value);

        }

    }

 

    void dequeue() {

        if (front == -1) {

            System.out.println("Queue is Empty");

        } else {

            System.out.println("Deleted: " + queue[front]);

            if (front == rear) front = rear = -1;

            else front = (front + 1) % SIZE;

        }

    }

 

    void display() {

        if (front == -1) {

            System.out.println("Queue is Empty");

            return;

        }

        int i = front;

        System.out.print("Queue: ");

        while (true) {

            System.out.print(queue[i] + " ");

            if (i == rear) break;

            i = (i + 1) % SIZE;

        }

        System.out.println();

    }

 

    public static void main(String[] args) {

        CircularQueue q = new CircularQueue();

        q.enqueue(10); q.enqueue(20); q.enqueue(30);

        q.display();

        q.dequeue(); q.dequeue();

        q.display();

        q.enqueue(40); q.enqueue(50); q.enqueue(60);

        q.display();

    }

}

Output

Inserted: 10
Inserted: 20
Inserted: 30
Queue: 10 20 30 
Deleted: 10
Deleted: 20
Queue: 30 
Inserted: 40
Inserted: 50
Inserted: 60
Queue: 30 40 50 60 

# Python Program – Circular Queue using List

class CircularQueue:

    def __init__(self, size):

        self.size = size

        self.queue = [None]*size

        self.front = self.rear = -1

 

    def enqueue(self, value):

        if (self.rear + 1) % self.size == self.front:

            print("Queue is Full")

        else:

            if self.front == -1:

                self.front = 0

            self.rear = (self.rear + 1) % self.size

            self.queue[self.rear] = value

            print(f"Inserted: {value}")

 

    def dequeue(self):

        if self.front == -1:

            print("Queue is Empty")

        else:

            print(f"Deleted: {self.queue[self.front]}")

            if self.front == self.rear:

                self.front = self.rear = -1

            else:

                self.front = (self.front + 1) % self.size

 

    def display(self):

        if self.front == -1:

            print("Queue is Empty")

            return

        i = self.front

        print("Queue:", end=" ")

        while True:

            print(self.queue[i], end=" ")

            if i == self.rear:

                break

            i = (i + 1) % self.size

        print()

 

# Usage

q = CircularQueue(5)

q.enqueue(10)

q.enqueue(20)

q.enqueue(30)

q.display()

q.dequeue()

q.dequeue()

q.display()

q.enqueue(40)

q.enqueue(50)

q.enqueue(60)

q.display()

Output

Inserted: 10
Inserted: 20
Inserted: 30
Queue: 10 20 30 
Deleted: 10
Deleted: 20
Queue: 30 
Inserted: 40
Inserted: 50
Inserted: 60
Queue: 30 40 50 60 

✅ Priority Queue Implementation - C, C++, Java, Python

 

Using Array

#include <stdio.h>

#define MAX 100

 

typedef struct {

    int data[MAX];

    int priority[MAX];

    int size;

} PriorityQueue;

 

void init(PriorityQueue* pq) {

    pq->size = 0;

}

 

void enqueue(PriorityQueue* pq, int value, int prio) {

    if (pq->size == MAX) {

        printf("Queue is full\n");

        return;

    }

    int i = pq->size - 1;

    // Insert based on priority (lower number = higher priority)

    while (i >= 0 && pq->priority[i] > prio) {

        pq->priority[i + 1] = pq->priority[i];

        pq->data[i + 1] = pq->data[i];

        i--;

    }

    pq->priority[i + 1] = prio;

    pq->data[i + 1] = value;

    pq->size++;

}

 

int dequeue(PriorityQueue* pq) {

    if (pq->size == 0) {

        printf("Queue is empty\n");

        return -1;

    }

    int val = pq->data[0];

    // Shift elements left

    for (int i = 1; i < pq->size; i++) {

        pq->data[i-1] = pq->data[i];

        pq->priority[i-1] = pq->priority[i];

    }

    pq->size--;

    return val;

}

 

void display(PriorityQueue* pq) {

    printf("Priority Queue: \n");

    for (int i = 0; i < pq->size; i++) {

        printf("Value: %d Priority: %d\n", pq->data[i], pq->priority[i]);

    }

}

 

int main() {

    PriorityQueue pq;

    init(&pq);

    enqueue(&pq, 40, 2);

    enqueue(&pq, 50, 1);

    enqueue(&pq, 60, 3);

    display(&pq);

    printf("Dequeued element: %d\n", dequeue(&pq));

    display(&pq);

    return 0;

}

Output

Priority Queue:

Value: 50 Priority: 1

Value: 40 Priority: 2

Value: 60 Priority: 3

 

Dequeued element: 50

 

Priority Queue:

Value: 40 Priority: 2

Value: 60 Priority: 3

#include <iostream>

using namespace std;

 

class PriorityQueue {

    int data[100];

    int priority[100];

    int size;

public:

    PriorityQueue() { size = 0; }

 

    void enqueue(int val, int prio) {

        if (size == 100) {

            cout << "Queue full\n";

            return;

        }

        int i = size - 1;

        while (i >= 0 && priority[i] > prio) {

            priority[i + 1] = priority[i];

            data[i + 1] = data[i];

            i--;

        }

        priority[i + 1] = prio;

        data[i + 1] = val;

        size++;

    }

 

    int dequeue() {

        if (size == 0) {

            cout << "Queue empty\n";

            return -1;

        }

        int val = data[0];

        for (int i = 1; i < size; i++) {

            data[i - 1] = data[i];

            priority[i - 1] = priority[i];

        }

        size--;

        return val;

    }

 

    void display() {

        cout << "Priority Queue:\n";

        for (int i = 0; i < size; i++) {

            cout << "Value: " << data[i] << " Priority: " << priority[i] << endl;

        }

    }

};

 

int main() {

    PriorityQueue pq;

    pq.enqueue(40, 2);

    pq.enqueue(50, 1);

    pq.enqueue(60, 3);

    pq.display();

    cout << "Dequeued element: " << pq.dequeue() << endl;

    pq.display();

    return 0;

}

Output

Priority Queue:

Value: 50 Priority: 1

Value: 40 Priority: 2

Value: 60 Priority: 3

 

Dequeued element: 50

 

Priority Queue:

Value: 40 Priority: 2

Value: 60 Priority: 3

public class PriorityQueueArray {

    private int[] data;

    private int[] priority;

    private int size;

    private int capacity;

 

    public PriorityQueueArray(int capacity) {

        this.capacity = capacity;

        data = new int[capacity];

        priority = new int[capacity];

        size = 0;

    }

 

    public void enqueue(int val, int prio) {

        if (size == capacity) {

            System.out.println("Queue full");

            return;

        }

        int i = size - 1;

        while (i >= 0 && priority[i] > prio) {

            priority[i + 1] = priority[i];

            data[i + 1] = data[i];

            i--;

        }

        priority[i + 1] = prio;

        data[i + 1] = val;

        size++;

    }

 

    public int dequeue() {

        if (size == 0) {

            System.out.println("Queue empty");

            return -1;

        }

        int val = data[0];

        for (int i = 1; i < size; i++) {

            data[i - 1] = data[i];

            priority[i - 1] = priority[i];

        }

        size--;

        return val;

    }

 

    public void display() {

        System.out.println("Priority Queue:");

        for (int i = 0; i < size; i++) {

            System.out.println("Value: " + data[i] + " Priority: " + priority[i]);

        }

    }

 

    public static void main(String[] args) {

        PriorityQueueArray pq = new PriorityQueueArray(10);

        pq.enqueue(40, 2);

        pq.enqueue(50, 1);

        pq.enqueue(60, 3);

        pq.display();

        System.out.println("Dequeued element: " + pq.dequeue());

        pq.display();

    }

}

Output

Priority Queue:

Value: 50 Priority: 1

Value: 40 Priority: 2

Value: 60 Priority: 3

 

Dequeued element: 50

 

Priority Queue:

Value: 40 Priority: 2

Value: 60 Priority: 3

class PriorityQueue:

    def __init__(self):

        self.data = []

        self.priority = []

 

    def enqueue(self, val, prio):

        i = len(self.priority) - 1

        self.priority.append(0)  # dummy append

        self.data.append(0)

        while i >= 0 and self.priority[i] > prio:

            self.priority[i + 1] = self.priority[i]

            self.data[i + 1] = self.data[i]

            i -= 1

        self.priority[i + 1] = prio

        self.data[i + 1] = val

 

    def dequeue(self):

        if len(self.data) == 0:

            print("Queue is empty")

            return None

        val = self.data.pop(0)

        self.priority.pop(0)

        return val

 

    def display(self):

        print("Priority Queue:")

        for v, p in zip(self.data, self.priority):

            print(f"Value: {v} Priority: {p}")

 

pq = PriorityQueue()

pq.enqueue(40, 2)

pq.enqueue(50, 1)

pq.enqueue(60, 3)

pq.display()

print("Dequeued element:", pq.dequeue())

pq.display()

Output

Priority Queue:

Value: 50 Priority: 1

Value: 40 Priority: 2

Value: 60 Priority: 3

 

Dequeued element: 50

 

Priority Queue:

Value: 40 Priority: 2

Value: 60 Priority: 3

Priority Queue using Linked List

#include <stdio.h>

#include <stdlib.h>

 

struct Node {

    int data;

    int priority;

    struct Node* next;

};

 

struct Node* front = NULL;

 

void enqueue(int d, int p) {

    struct Node* temp = (struct Node*)malloc(sizeof(struct Node));

    temp->data = d;

    temp->priority = p;

    temp->next = NULL;

 

    if (!front || p < front->priority) {

        temp->next = front;

        front = temp;

    } else {

        struct Node* start = front;

        while (start->next && start->next->priority <= p)

            start = start->next;

        temp->next = start->next;

        start->next = temp;

    }

}

 

void dequeue() {

    if (!front) {

        printf("Queue is empty\n");

        return;

    }

    struct Node* temp = front;

    front = front->next;

    printf("Dequeued element: %d\n", temp->data);

    free(temp);

}

 

void display() {

    struct Node* temp = front;

    printf("Priority Queue:\n");

    while (temp) {

        printf("Value: %d Priority: %d\n", temp->data, temp->priority);

        temp = temp->next;

    }

}

Output

Priority Queue:
Value: 50 Priority: 1
Value: 40 Priority: 2
Value: 60 Priority: 3

Dequeued element: 50

Priority Queue:
Value: 40 Priority: 2
Value: 60 Priority: 3

#include <iostream>

using namespace std;

 

struct Node {

    int data, priority;

    Node* next;

};

 

Node* front = nullptr;

 

void enqueue(int d, int p) {

    Node* temp = new Node{d, p, nullptr};

 

    if (!front || p < front->priority) {

        temp->next = front;

        front = temp;

    } else {

        Node* start = front;

        while (start->next && start->next->priority <= p)

            start = start->next;

        temp->next = start->next;

        start->next = temp;

    }

}

 

void dequeue() {

    if (!front) {

        cout << "Queue is empty\n";

        return;

    }

    Node* temp = front;

    front = front->next;

    cout << "Dequeued element: " << temp->data << endl;

    delete temp;

}

 

void display() {

    Node* temp = front;

    cout << "Priority Queue:\n";

    while (temp) {

        cout << "Value: " << temp->data << " Priority: " << temp->priority << endl;

        temp = temp->next;

    }

}

Output

Priority Queue:
Value: 50 Priority: 1
Value: 40 Priority: 2
Value: 60 Priority: 3

Dequeued element: 50

Priority Queue:
Value: 40 Priority: 2
Value: 60 Priority: 3

class Node {

    int data, priority;

    Node next;

 

    public Node(int data, int priority) {

        this.data = data;

        this.priority = priority;

        this.next = null;

    }

}

 

public class PriorityQueueLinkedList {

    static Node front = null;

 

    static void enqueue(int data, int priority) {

        Node temp = new Node(data, priority);

        if (front == null || priority < front.priority) {

            temp.next = front;

            front = temp;

        } else {

            Node start = front;

            while (start.next != null && start.next.priority <= priority)

                start = start.next;

            temp.next = start.next;

            start.next = temp;

        }

    }

 

    static void dequeue() {

        if (front == null) {

            System.out.println("Queue is empty");

            return;

        }

        System.out.println("Dequeued element: " + front.data);

        front = front.next;

    }

 

    static void display() {

        Node temp = front;

        System.out.println("Priority Queue:");

        while (temp != null) {

            System.out.println("Value: " + temp.data + " Priority: " + temp.priority);

            temp = temp.next;

        }

    }

 

    public static void main(String[] args) {

        enqueue(40, 2);

        enqueue(50, 1);

        enqueue(60, 3);

        display();

        dequeue();

        display();

    }

}

Output

Priority Queue:
Value: 50 Priority: 1
Value: 40 Priority: 2
Value: 60 Priority: 3

Dequeued element: 50

Priority Queue:
Value: 40 Priority: 2
Value: 60 Priority: 3

class Node:

    def __init__(self, data, priority):

        self.data = data

        self.priority = priority

        self.next = None

 

class PriorityQueue:

    def __init__(self):

        self.front = None

 

    def enqueue(self, data, priority):

        new_node = Node(data, priority)

        if not self.front or priority < self.front.priority:

            new_node.next = self.front

            self.front = new_node

        else:

            temp = self.front

            while temp.next and temp.next.priority <= priority:

                temp = temp.next

            new_node.next = temp.next

            temp.next = new_node

 

    def dequeue(self):

        if not self.front:

            print("Queue is empty")

            return

        print(f"Dequeued element: {self.front.data}")

        self.front = self.front.next

 

    def display(self):

        temp = self.front

        print("Priority Queue:")

        while temp:

            print(f"Value: {temp.data} Priority: {temp.priority}")

            temp = temp.next

 

# Example usage

pq = PriorityQueue()

pq.enqueue(40, 2)

pq.enqueue(50, 1)

pq.enqueue(60, 3)

pq.display()

pq.dequeue()

pq.display()

Output

Priority Queue:
Value: 50 Priority: 1
Value: 40 Priority: 2
Value: 60 Priority: 3

Dequeued element: 50

Priority Queue:
Value: 40 Priority: 2
Value: 60 Priority: 3

🔁 Queue-Based Real-World Applications

1. Print Queue

  • Scenario: When multiple documents are sent to a printer, they are queued and printed one by one.
  • Why Queue: Ensures First-In-First-Out (FIFO)

2. Task Scheduling in Operating Systems

  • Scenario: Processes waiting for CPU time are managed in ready queues, I/O queues, etc.
  • Why Queue: Ensures fair allocation of CPU to processes.

3. Customer Service Systems

  • Scenario: Calls or chat requests are placed in a queue to be handled by the next available agent.
  • Why Queue: Helps maintain service order and fairness.

4. Breadth-First Search (BFS) in Graph Algorithms

  • Scenario: Used in shortest path problems, peer-to-peer networks, etc.
  • Why Queue: BFS uses a queue to explore nodes level by level.

5. Data Buffers (IO Buffers, Network Routers)

  • Scenario: Buffers hold data temporarily while it's being moved from one place to another.
  • Why Queue: Helps in smooth data transmission when producer-consumer rates differ.

6. Order Processing Systems (E-commerce)

  • Scenario: Orders placed are queued and processed in the order they were received.
  • Why Queue: Maintains transaction integrity and order.

7. Message Queues in Distributed Systems

  • Scenario: Systems like RabbitMQ, Kafka use queues for decoupled communication between microservices.
  • Why Queue: Ensures reliable and scalable communication.

8. Traffic Management Systems

  • Scenario: Vehicles at a traffic signal or toll booth are queued.
  • Why Queue: Helps manage congestion and flow.

9. Call Center Hold Queue

  • Scenario: When all representatives are busy, incoming calls are placed in a queue.
  • Why Queue: Preserves the order in which users requested service.

10. Ticket Booking Systems

  • Scenario: Railway, airline, or cinema booking systems use queues when demand is high.
  • Why Queue: Ensures fairness in ticket allotment.