#include #include template class TQueue { friend ostream& operator << (ostream&, TQueue&); public: TQueue() { front = back = 0; } ~TQueue(); T get(); void put(const T&); int is_empty() { return((!front) ? 1 : 0); } private: class TQueueItem { // friend ostream& operator << (ostream&, TQueueItem&); public: TQueueItem(T value): item(value), next(0) { } T item; TQueueItem *next; }; TQueueItem *front, *back; }; /* template ostream& operator << (ostream &os, TQueueItem &qi) { os << qi.item; return os; } */ template ostream& operator << (ostream &os, TQueue &q) { os << "< "; TQueue :: TQueueItem *p; for(p = q.front; p; p = p -> next) os << p -> item << " "; os << " >" << endl; return os; } template TQueue :: ~TQueue() { while(!is_empty()) (void)get(); } template void TQueue :: put(const T &value) { TQueueItem *pt = new TQueueItem(value); if(is_empty()) { front = back = pt; } else { back -> next = pt; back = pt; } } template T TQueue :: get() { if(is_empty()) { cout << "Trying to Get from the empty queue !\n"; exit(-1); } TQueueItem *pt = front; front = front -> next; T value = pt -> item; delete pt; return value; } int main() { TQueue i_q; for(int i = 0; i < 10; ++i) { i_q.put(i); i_q.put(10 * i); } cout << i_q; while(!(i_q.is_empty())) { cout << i_q.get() << endl; } cout << i_q; return 0; }