namespace rosettacode { template class queue { public: queue(); ~queue(); void push(T const& t); T pop(); bool empty(); private: void drop(); struct node; node* head; node* tail; }; template struct queue::node { T data; node* next; node(T const& t): data(t), next(0) {} }; template queue::queue(): head(0) { } template inline void queue::drop() { node* n = head; head = head->next; delete n; } template queue::~queue() { while (!empty()) drop(); } template void queue::push(T const& t) { node*& next = head? tail->next : head; next = new node(t); tail = next; } template T queue::pop() { T tmp = head->data; drop(); return tmp; } template bool queue::empty() { return head == 0; } }