// Queue.h Dave Reed 9/10/02 // // A templated Queue class, implemented using linked lists. //////////////////////////////////////////////////////////////// #ifndef _QUEUE_ #define _QUEUE_ template class Node // class for storing some item { // in a linked list public: Type item; Node * next; }; template class Queue { public: Queue(); // constructor Queue(const Queue & q); // copy constructor ~Queue(); // destructor Queue & operator=(const Queue & q); bool IsEmpty() const; // returns if queue is empty void Enter(const Type & item); // enters item at rear of queue void Remove(); // removes item at front of queue Type & Front(); // returns item at front of queue private: Node * myFront; // pointers to linked list of items Node * myRear; Node * CopyList(const Node * ptr); }; ////////////////////////////////////////////////////////////////////////// template Queue::Queue() // Constructor: initializes queue to be empty (myFront = myRear = NULL) { myFront = NULL; myRear = NULL; } template Node * Queue::CopyList(const Node * ptr) // private member function to recursively copy a linked list { if (ptr == NULL) { return NULL; } else { Node * copyFront = new Node; copyFront->item = ptr->item; copyFront->next = CopyList(ptr->next); return copyFront; } } template Queue::Queue(const Queue & q) // Constructor: initializes queue to be empty (myFront = myRear = NULL) { myFront = CopyList(q.myFront); myRear = myFront; while (myRear != NULL && myRear->next != NULL) { myRear = myRear->next; } } template Queue & Queue::operator=(const Queue & q) // Assignment operator { if (this != &q) { while (!IsEmpty()) { Remove(); } myFront = CopyList(q.myFront); myRear = myFront; while (myRear != NULL && myRear->next != NULL) { myRear = myRear->next; } } return *this; } template Queue::~Queue() // Destructor: deallocates nodes in the linked list { while (!IsEmpty()) { Remove(); } } template bool Queue::IsEmpty() const // Returns: true if empty queue, else false { return (myFront == NULL); } template void Queue::Enter(const Type & toBeEntered) // Results: enters toBeEntered at rear of queue { Node * temp = new Node; temp->item = toBeEntered; temp->next = NULL; if (myRear == NULL) { myRear = temp; myFront = temp; } else { myRear->next = temp; myRear = temp; } } template void Queue::Remove() // Assumes: queue is not empty // Results: removes an item from the front of the queue { Node * temp = myFront; myFront = myFront->next; delete temp; if (myFront == NULL) { myRear = NULL; } } template Type & Queue::Front() // Assumes: queue is not empty // Returns: reference to item at the front of the queue { return myFront->item; } #endif