// From the software distribution accompanying the textbook // "A Practical Introduction to Data Structures and Algorithm Analysis, // Third Edition (C++)" by Clifford A. Shaffer. // Source code Copyright (C) 2007-2011 by Clifford A. Shaffer. // This is the file to include in your code if you want access to the // complete LQueue template class // Include the link class #include "link.h" // First, get the declaration for the base stack class #include "queue.h" // Implementations for linked queue function members // Linked queue implementation template class LQueue: public Queue { private: Link* front; // Pointer to front queue node Link* rear; // Pointer to rear queue node int size; // Number of elements in queue public: LQueue(int sz =defaultSize) // Constructor { front = rear = new Link(); size = 0; } ~LQueue() { clear(); delete front; } // Destructor void clear() { // Clear queue while(front->next != NULL) { // Delete each link node rear = front; delete rear; } rear = front; size = 0; } void enqueue(const E& it) { // Put element on rear rear->next = new Link(it, NULL); rear = rear->next; size++; } E dequeue() { // Remove element from front Assert(size != 0, "Queue is empty"); E it = front->next->element; // Store dequeued value Link* ltemp = front->next; // Hold dequeued link front->next = ltemp->next; // Advance front if (rear == ltemp) rear = front; // Dequeue last element delete ltemp; // Delete link size --; return it; // Return element value } const E& frontValue() const { // Get front element Assert(size != 0, "Queue is empty"); return front->next->element; } virtual int length() const { return size; } };