#ifndef __LL_QUEUE_HPP__ #define __LL_QUEUE_HPP__ #include template class node { public: T data; node* next; node() { next = NULL; } node(T elem) { data = elem; next = NULL; } }; template class LL_Queue { private: node* front, * rear; public: LL_Queue() { front = rear = NULL; } LL_Queue(T elem) { node* newNode = new node(elem); front = rear = newNode; } LL_Queue(const LL_Queue& q2); // copy constructor ~LL_Queue(); bool isEmpty() { return front == NULL;} bool isFull(); void enqueue(T elem); T dequeue(); }; template bool LL_Queue::isFull() { //T elem; node* newNode = new node(); if (newNode == NULL) return true; delete newNode; return false; } template void LL_Queue::enqueue(T elem) { assert(!isFull()); node* newNode = new node(elem); // the queue is empty if (front == NULL) { front = rear = newNode; } else { rear->next = newNode; rear = newNode; } } template T LL_Queue::dequeue() { assert(!isEmpty()); T rlt = front->data; node* tmp = front; front = front->next; if (front == NULL) { // after dequeue, the queue is empty front = rear = NULL; } delete tmp; return rlt; } // copy constructor template LL_Queue::LL_Queue(const LL_Queue& q2) { front = rear = NULL; node* tmp = q2.front; while (tmp != NULL) { node* newNode = new node(tmp->data); if (front == NULL) { front = rear = newNode; } else { rear->next = newNode; rear = newNode; } tmp = tmp->next; } } template LL_Queue::~LL_Queue() { node* tmp; while (front != NULL) { tmp = front; front = front->next; delete tmp; } } #endif