#include <iostream>
#include <queue>
// Define a structure for a node in the queue
struct QueueNode {
int data;
QueueNode* next;
};
// Define a structure for the queue
struct Queue {
QueueNode* front;
QueueNode* rear;
};
// Function to initialize an empty queue
void initQueue(Queue& q) {
q.front = q.rear = nullptr;
}
// Function to check if the queue is empty
bool isEmpty(const Queue& q) {
return q.front == nullptr;
}
// Function to enqueue a new element into the queue
void enqueue(Queue& q, int value) {
QueueNode* newNode = new QueueNode{value, nullptr};
if (isEmpty(q)) {
q.front = q.rear = newNode;
} else {
q.rear->next = newNode;
q.rear = newNode;
}
}
// Function to dequeue an element from the queue
void dequeue(Queue& q) {
if (!isEmpty(q)) {
QueueNode* temp = q.front;
q.front = q.front->next;
delete temp;
} else {
std::cout << "Queue is empty. Cannot dequeue.\n";
}
}
// Function to get the front element of the queue without dequeueing
int front(const Queue& q) {
if (!isEmpty(q)) {
return q.front->data;
} else {
std::cerr << "Queue is empty. No front element.\n";
return -1; // Assuming -1 represents an invalid value
}
}
// Function to display the elements in the queue
void display(const Queue& q) {
if (isEmpty(q)) {
std::cout << "Queue is empty.\n";
} else {
std::cout << "Queue elements: ";
QueueNode* current = q.front;
while (current != nullptr) {
std::cout << current->data << " ";
current = current->next;
}
std::cout << "\n";
}
}
// Function to deallocate memory used by the queue
void clearQueue(Queue& q) {
while (!isEmpty(q)) {
dequeue(q);
}
}
int main() {
// Example usage of the queue
Queue myQueue;
initQueue(myQueue);
enqueue(myQueue, 10);
enqueue(myQueue, 20);
enqueue(myQueue, 30);
display(myQueue);
std::cout << "Front element: " << front(myQueue) << "\n";
dequeue(myQueue);
display(myQueue);
clearQueue(myQueue);
return 0;
}