#ifndef QUEUEH
#define QUEUEH

template <class EltType> class Queue;         // forward decln of Queue

template <class EltType> class QCell          // QCell
 { friend class Queue<EltType>;

   private: QCell(const EltType& v, QCell* p) // constructor
             : elt(v)
             { next=p; }

            EltType elt;                      // data
            QCell* next;                      // link pointer
 };//QCell

template <class EltType> class Queue          // Queue
 { public:  Queue() { first=0; last=0; }      // constructor

           ~Queue() { while( first )          // destructor
                       { QCell<EltType> *p = first;
                         first = first->next; delete p;
                       }
                      last = 0;
                    }//destructor

            void enQ(const EltType&);         // add an element to the queue

            EltType deQ();                    // remove and return 1st element

            int empty()                       // ? queue is empty ?
             { return first == 0; }

   private: QCell<EltType> *first, *last;     // pointers to front and end
 };//Queue

#include "Queue.ipp"  // the template(!) implementation of Queue enQ and deQ

#endif

// Queue definitions: Queue.h
// http://www.allisons.org/ll/ProgLang/Cplusplus/

