/* Queue ADT Type Defintions Written by: G & F Date: 2/98 Revised: 4/99--Converted to C++ Brooks/Cole A division of Thomson Learning Copyright(c) 2001. All Rights Reserved */ // Node Declaration template struct NODE { TYPE data; NODE *next; }; // Class Declaration template class Queue { private: NODE *front; int count; NODE *rear; public: Queue (void); ~Queue (void); bool dequeue (TYPE& dataOut); bool enqueue (TYPE dataIn); bool queueFront (TYPE& dataOut); bool queueRear (TYPE& dataOut); int queueCount (void); bool emptyQueue (void); bool fullQueue (void); }; // class Queue /* ================== Constructor ================= Instantiates a queue and initializes private data. Pre queue being defined Post queue created and initialized */ template Queue :: Queue (void) { // Statements front = NULL; rear = NULL; count = 0; } // Constructor /* ================== enqueue ================= This algorithm inserts data into a queue. Pre dataIn contains data to be enqueued Post data have been inserted Return true if successful, false if overflow */ template bool Queue :: enqueue (TYPE dataIn) { // Local Definitions NODE *newPtr; // Statements if (!(newPtr = new NODE)) return false; newPtr->data = dataIn; newPtr->next = NULL; if (count == 0) // Inserting into empty queue front = newPtr; else rear->next = newPtr; count++; rear = newPtr; return true; } //enqueue /* ================= dequeue ================== This algorithm deletes a node from the queue. Pre dataOut variable to receive data Post front data placed in dataOut and front deleted Return true if successful, false if underflow */ template bool Queue :: dequeue (TYPE& dataOut) { // Local Definitions NODE *deleteLoc; // Statements if (count == 0) return false; dataOut = front->data; deleteLoc = front; if (count == 1) // Deleting the only item in queue rear = front = NULL; else front = front->next; count--; delete deleteLoc; return true; } // dequeue /* ================== queueFront ================== Retrieves data at the front of the queue without changing the queue contents. Pre dataOut is variable for data Post data in dataOut Return true if successful, false if underflow */ template bool Queue :: queueFront (TYPE& dataOut) { // Statements if (count == 0) return false; else { dataOut = front->data; return true; } //else } // queueFront /* =============== queueRear ============== Retrieves data at the rear of the queue without changing the queue contents. Pre dataOut is variable to receive data Post dataOut contains data at rear of queue Return true if successful, false if underflow */ template bool Queue :: queueRear (TYPE& dataOut) { // Statements if (count == 0) return false; else { dataOut = rear->data; return true; } // else } // queueRear /* =================== emptyQueue ================== This algorithm checks to see if a queue is empty. Pre nothing Return true if empty, false if queue has data */ template bool Queue :: emptyQueue (void) { // Statements return (count == 0); } // emptyQueue /* =================== fullQueue =================== This algorithm checks to see if a queue is full. The queue is full if memory cannot be allocated for another node. Pre nothing Return true if full, false if room for a node */ template bool Queue :: fullQueue (void) { // Local Definitions NODE *temp; // Statements temp = new NODE; if (temp != NULL) { delete temp; return false; } // if // Heap full return true; } // fullQueue /* =============== queueCount ============== Returns the number of elements in the queue. Pre nothing Return queue count */ template int Queue :: queueCount(void) { // Statements return count; } // queueCount /* =================== Destructor ================== Deletes all data from a queue and recycles its memory. Pre queue is being destroyed Post all data have been deleted and recycled */ template Queue :: ~Queue (void) { // Local Definitions NODE *deletePtr; // Statements while (front != NULL) { deletePtr = front; front = front->next; delete deletePtr; } // while } // Destructor