Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- using namespace std;
- struct cell // Структура каждой ячейки
- {
- int value; // число, которое она в себе хранит
- cell* next; // указатель на следующую ячейку
- cell(int value, cell* next) // Конструктор, который ускоряет создание ячеек
- {
- this->value = value;
- this->next = next;
- }
- };
- struct queue // Структура самой очереди
- {
- cell* first; //Указатель на первый элемент
- cell* last; //Указатель на последний элемент
- queue()
- {
- first = last = nullptr; // Когда создаётся очередь, она пустая, поэтому и указатели (first и last) должны быть пустыми
- };
- bool isEmpty() // Если первого элемента нет, значит очередь пустая
- {
- return first == nullptr;
- };
- void push(int value)
- {
- cell* newCell = new cell(value, nullptr); // Создаём ячейку в памяти с нашим значением
- if (isEmpty()) // Если очередь пустая
- {
- first = last = newCell; // То мы добавляем первый элдемент и оба указателя должны на него указывать
- }
- else
- {
- last->next = newCell; // Следующим для последнего становится наша новая ячейка
- last = newCell; // И теперь она сама становится последней
- }
- };
- int pop()
- {
- if (isEmpty()) // Если очередь пустая
- {
- throw exception("Queue is empty"); // Кидаем ошибку, т.к. удалять нечего
- }
- else if (first == last) // Если у нас только один элемент в очереди
- {
- int toReturn = first->value; // Сохраняем значение этого элемента(Чтобы вернуть)
- delete first; // Удаляем указаетль на него
- first = last = nullptr; // И зануляем оба, т.к. был лишь один элемент
- return toReturn; // возвращаем значение
- }
- else // Если в очереди 2+ элементов
- {
- cell* tmp = first; // Сохраняем указатель на наш первый
- int toReturn = tmp->value; // сохраняем значение, которое нужно вернуть
- first = first->next; // Переставляем на следующее место указатель первого (Т.к. нужно удалить первый)
- delete tmp; // удаляем наш указатель
- return toReturn; // возвращаем значение
- }
- };
- void print() // Вывод
- {
- if (isEmpty()) // Если очередь пустая
- {
- cout << "Queue is empty" << endl; // сообщаем
- return; // завершаем
- }
- cell* tmp = first; // Создаём указатель-бегунок
- size_t k = 1; // Счётчик для красивого вывода
- while (tmp != nullptr) // Пока он не пустой
- {
- cout << k++ << ") " << tmp->value << endl; // Выводим элемент и одновременно делаем ++
- tmp = tmp->next; // делаем шаг
- }
- }
- };
- int main()
- {
- try
- {
- size_t arraySize;
- ifstream in("input.txt");
- if (!in.is_open())
- throw exception("File is not opened");
- in >> arraySize;
- int* array = new int[arraySize];
- size_t k = 0;
- while (!in.eof())
- in >> array[k++];
- in.close();
- queue correctQueue;
- for (size_t i = 0; i < arraySize; i++)
- if (array[i] > 0)
- correctQueue.push(array[i]);
- for (size_t i = 0; i < arraySize; i++)
- if (array[i] <= 0)
- correctQueue.push(array[i]);
- correctQueue.print();
- }
- catch (exception ex)
- {
- cout << "Error: " << ex.what() << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment