Skip to content

Instantly share code, notes, and snippets.

@DieTime
Last active May 28, 2020 06:45
Show Gist options
  • Save DieTime/07ec1d8faf098feb873c222dbdbf276d to your computer and use it in GitHub Desktop.
Save DieTime/07ec1d8faf098feb873c222dbdbf276d to your computer and use it in GitHub Desktop.
Queue with insert ascending
#include <iostream>
#include <cassert>
using namespace std;
// Элемент очереди
class Node {
public:
int value; // Значение
Node *last; // Предыдущий элемент
Node *next; // Следующий элемент
Node(int val, Node *l, Node *n) {
value = val;
last = l;
next = n;
}
};
// Очередь
class Queue {
private:
// Начало очереди
Node *head = nullptr;
public:
// Длина очереди
int length = 0;
// Высвобождение выделенной памяти
~Queue() {
if (head != nullptr) {
// Проходим по всем элементам
Node *temp = head;
while (temp->next != nullptr) {
temp = temp->next;
// Высвобождаем память
delete temp->last;
}
delete temp;
}
}
void push(int value) {
// Если в очереди еще нет элементов
if (head == nullptr) {
head = new Node(value, nullptr, nullptr);
length++;
}
// Если уже имеются элементы
else {
// Пробегаемся по очереди и ищем место вставки
Node *temp = head;
while (temp->next != nullptr && value > temp->value) {
temp = temp->next;
}
// Если в найденом месте уже есть этот элемент - вывод сообщения
if (temp->value == value) {
cout << "Element " << value << " is already in the queue" << endl;
}
// Если данного элемента нет
else {
// Если во время поиска мы дошли до конца
if (temp->next == nullptr) {
// Добавляем элемент в конец
temp->next = new Node(value, temp, nullptr);
}
// Если во время поиска дошли не до конца
else {
// Переносим элемент в данном месте вперед
temp->next = new Node(temp->value, temp, temp->next);
// Вместо него устанавливаем наш элемент
temp->value = value;
}
length++;
}
}
}
int pop() {
// Проверка что очередь не пустая, иначе ошибка
assert(("Queue length is zero, it is not possible to use the pop function!", head != nullptr));
// Запоминаем значение в голове очереди
int value = head->value;
// Если элемент единственный - очищаем начало очереди
if (head->next == nullptr) {
delete head;
head = nullptr;
}
/* Если элементов несколько - удаляем головной элемент
и следующий элемент становится головным */
else {
Node *new_head = head->next;
delete head;
head = new_head;
head->last = nullptr;
}
// Уменьшаем длину
length--;
// Возвращаем значение
return value;
}
void print() {
cout << "{";
if (head != nullptr) {
Node *temp = head;
while (temp->next != nullptr) {
cout << temp->value << ",";
temp = temp->next;
}
cout << temp->value;
}
cout << "}" << endl;
}
};
int main() {
Queue queue; // Очередь
int count; // Число считываемых элементов
int item; // Переменная для считывания
cout << "Number of values to enter: ";
cin >> count;
// Заполнение данных
int length = queue.length; // Запоминаем длину очереди
for (int i = 0; i < count; i++) {
// Считывание элемента из консоли
cout << "\nEnter value: ";
cin >> item;
// Выводим добавляемый элемент и добавляем в очередь
cout << "Push " << item << " -> ";
queue.push(item); // Если элемент уже есть - выводится сообщение
// Если данные добавлены - выводим текущую очередь
if (queue.length > length) {
queue.print();
length = queue.length;
}
}
// Вывод итоговой очереди
cout << "\nFinal queue: ";
queue.print();
cout << endl;
// Получаем значения из очереди
while (queue.length != 0) {
cout << "Pop " << queue.pop() << " <- ";
queue.print();
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment