C++ Queues

Welcome to The Coding College! In this tutorial, we’ll explore queues in C++, one of the most essential data structures for solving real-world problems. Queues are widely used in scenarios like task scheduling, buffering, and simulation.

What Is a Queue?

A queue is a linear data structure that follows the First In, First Out (FIFO) principle. This means the first element added to the queue is the first one to be removed.

Key Characteristics of Queues:

  1. Push (Enqueue): Add elements to the back of the queue.
  2. Pop (Dequeue): Remove elements from the front of the queue.
  3. Front: Access the first element.
  4. Back: Access the last element.

Declaring a Queue

To use queues in C++, include the <queue> header.

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue; // Declare a queue of integers

    return 0;
}

Common Operations on Queues

1. Push (Enqueue)

The push method adds elements to the back of the queue.

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue;

    myQueue.push(10); // Add 10
    myQueue.push(20); // Add 20
    myQueue.push(30); // Add 30

    cout << "Front element: " << myQueue.front() << endl; // Access the front
    cout << "Back element: " << myQueue.back() << endl;   // Access the back

    return 0;
}

Output:

Front element: 10  
Back element: 30  

2. Pop (Dequeue)

The pop method removes the front element from the queue.

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    myQueue.pop(); // Remove the front element (10)

    cout << "Front element after pop: " << myQueue.front() << endl;

    return 0;
}

Output:

Front element after pop: 20  

3. Check Size

The size method returns the number of elements in the queue.

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    cout << "Queue size: " << myQueue.size() << endl;

    return 0;
}

Output:

Queue size: 3  

4. Check if the Queue Is Empty

The empty method checks whether the queue contains any elements.

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue;

    if (myQueue.empty()) {
        cout << "The queue is empty!" << endl;
    }

    myQueue.push(10);

    if (!myQueue.empty()) {
        cout << "The queue is not empty!" << endl;
    }

    return 0;
}

Output:

The queue is empty!  
The queue is not empty!  

Iterating Over a Queue

Since queues do not support direct iteration, you can only access elements by repeatedly dequeuing them.

Example: Print All Elements

#include <queue>
#include <iostream>
using namespace std;

int main() {
    queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    while (!myQueue.empty()) {
        cout << myQueue.front() << " "; // Print the front element
        myQueue.pop();                  // Remove the front element
    }

    return 0;
}

Output:

10 20 30  

Applications of Queues

  1. Task Scheduling: Manage tasks in operating systems or print jobs.
  2. Breadth-First Search (BFS): Use queues in graph traversal algorithms.
  3. Simulation: Model real-world scenarios like ticket booking systems or customer service lines.
  4. Data Streaming: Handle incoming data streams in buffers.

Real-World Example: Implement a Task Queue

#include <queue>
#include <iostream>
#include <string>
using namespace std;

int main() {
    queue<string> taskQueue;

    // Add tasks to the queue
    taskQueue.push("Task 1");
    taskQueue.push("Task 2");
    taskQueue.push("Task 3");

    cout << "Processing tasks:" << endl;

    while (!taskQueue.empty()) {
        cout << taskQueue.front() << " is being processed." << endl;
        taskQueue.pop();
    }

    return 0;
}

Output:

Processing tasks:  
Task 1 is being processed.  
Task 2 is being processed.  
Task 3 is being processed.  

Summary

  • Advantages: Simplifies FIFO operations.
  • Key Operations: push, pop, front, back, size, and empty.
  • Applications: Task scheduling, BFS, and buffering systems.

Learn More at The Coding College

For more C++ tutorials and programming concepts, visit The Coding College.

Leave a Comment