/* * lqueue.cpp * * Created on: 30.10.2015 г. * Author: trifon */ #include using namespace std; template struct QueueElement { T data; QueueElement* next; QueueElement(T const& _data = T(), QueueElement* _next = NULL) : data(_data), next(_next) {} }; template class LinkedQueue { QueueElement *front, *back; void copy(LinkedQueue const& q) { for(QueueElement* p = q.front;p != NULL;p = p->next) enqueue(p->data); } void clean() { while (!empty()) dequeue(); } public: LinkedQueue() : front(NULL), back(NULL) {} LinkedQueue(LinkedQueue const& q) : front(NULL), back(NULL) { copy(q); } LinkedQueue& operator=(LinkedQueue const& q) { if (this != &q) { clean(); copy(q); } return *this; } ~LinkedQueue() { clean(); } bool empty() const { return back == NULL; } void enqueue(T const& x) { QueueElement* p = new QueueElement(x); if (!empty()) { back->next = p; } else front = p; back = p; } T dequeue() { if (empty()) { cerr << "Опит за изключване от празна опашка!\n"; return T(); } QueueElement* p = front; front = front->next; if (front == NULL) back = NULL; T x = p->data; delete p; return x; } T head() const { if (empty()) { cerr << "Опит за поглеждане в празна опашка!\n"; return T(); } return front->data; } };