Очереди на списках - EcsFlash/DataTypes GitHub Wiki
Исходный код - тут
Название типа данных полностью отражает его суть. Представьте себе стандартную очередь возле ларька/кассы в магазине. Элементы(люди) добавляются в конец очереди, а выходят с начала. Соответственно весь код по сути, сводится к двум вещам - добавление элемента в конец связного списка и удаление элемента из начала этого же списка. Использовать будем обычный односвязный линейный список.
struct Node {
T data;
Node* next;
Node(T elem) : data(elem), next(nullptr) {};
};
Queue() {
head = tail = nullptr;
count = 0;
}
void enque(T elem) {
Node* p = new Node(elem);
if (!isEmpty()) {
tail->next = p;
tail = p;
}
else {
head = tail = p;
}
count++;
}
void deque() {
if (!isEmpty()) {
if (head != tail) {
Node* p = head;
head = head->next;
delete p;
p = nullptr;
count--;
}
else {
delete head, tail;
head = tail = nullptr;
count = 0;
}
}
}
T peek() {
if (!isEmpty()) {
return head->data;
}
}
тут тоже нужно кидаться ошибками, чуть подробнее почему это нужно написал в аналогичной ситуации в стеках.
friend std::ostream& operator<<(std::ostream& os, const Queue& a) {
stringstream ss;
Node* temp = a.head;
while (temp != nullptr) {
ss << temp->data;
temp = temp->next;
}
return os << ss.str();
}
bool isEmpty() {
return head == nullptr && tail == nullptr;
}
void clear() {
while (head != nullptr && tail != nullptr) {
deque();
}
}
~Queue() {
clear();
}