Last active
May 28, 2020 06:45
-
-
Save DieTime/07ec1d8faf098feb873c222dbdbf276d to your computer and use it in GitHub Desktop.
Queue with insert ascending
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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