#include <iostream>
// Node structure for the linked list
template <typename T>
struct Node {
T data;
Node* next;
Node(T val) : data(val), next(nullptr) {}
};
// Queue class using linked list
template <typename T>
class Queue {
private:
Node<T>* front;
Node<T>* rear;
public:
// Constructor
Queue() : front(nullptr), rear(nullptr) {}
// Destructor
~Queue() {
while (!isEmpty()) {
dequeue();
}
}
// Check if the queue is empty
bool isEmpty() const {
return front == nullptr;
}
// Enqueue a new element at the rear of the queue
void enqueue(T val) {
Node<T>* newNode = new Node<T>(val);
if (isEmpty()) {
front = rear = newNode;
} else {
rear->next = newNode;
rear = newNode;
}
}
// Dequeue the front element from the queue
void dequeue() {
if (!isEmpty()) {
Node<T>* temp = front;
front = front->next;
delete temp;
if (front == nullptr) {
rear = nullptr;
}
}
}
// Get the front element of the queue without removing it
T getFront() const {
if (!isEmpty()) {
return front->data;
} else {
// Handle empty queue case (assuming T is default-constructible)
return T();
}
}
};
int main() {
Queue<int> myQueue;
myQueue.enqueue(10);
myQueue.enqueue(20);
myQueue.enqueue(30);
std::cout << "Front element: " << myQueue.getFront() << std::endl;
myQueue.dequeue();
std::cout << "Front element after dequeue: " << myQueue.getFront() << std::endl;
return 0;
}