Sanlover

Untitled

Sep 29th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. struct cell // Структура каждой ячейки
  6. {
  7. int value; // число, которое она в себе хранит
  8. cell* next; // указатель на следующую ячейку
  9.  
  10. cell(int value, cell* next) // Конструктор, который ускоряет создание ячеек
  11. {
  12. this->value = value;
  13. this->next = next;
  14. }
  15. };
  16.  
  17. struct queue // Структура самой очереди
  18. {
  19. cell* first; //Указатель на первый элемент
  20. cell* last; //Указатель на последний элемент
  21.  
  22. queue()
  23. {
  24. first = last = nullptr; // Когда создаётся очередь, она пустая, поэтому и указатели (first и last) должны быть пустыми
  25. };
  26. bool isEmpty() // Если первого элемента нет, значит очередь пустая
  27. {
  28. return first == nullptr;
  29. };
  30.  
  31. void push(int value)
  32. {
  33. cell* newCell = new cell(value, nullptr); // Создаём ячейку в памяти с нашим значением
  34. if (isEmpty()) // Если очередь пустая
  35. {
  36. first = last = newCell; // То мы добавляем первый элдемент и оба указателя должны на него указывать
  37. }
  38. else
  39. {
  40. last->next = newCell; // Следующим для последнего становится наша новая ячейка
  41. last = newCell; // И теперь она сама становится последней
  42. }
  43. };
  44.  
  45. int pop()
  46. {
  47. if (isEmpty()) // Если очередь пустая
  48. {
  49. throw exception("Queue is empty"); // Кидаем ошибку, т.к. удалять нечего
  50. }
  51. else if (first == last) // Если у нас только один элемент в очереди
  52. {
  53. int toReturn = first->value; // Сохраняем значение этого элемента(Чтобы вернуть)
  54. delete first; // Удаляем указаетль на него
  55. first = last = nullptr; // И зануляем оба, т.к. был лишь один элемент
  56. return toReturn; // возвращаем значение
  57. }
  58. else // Если в очереди 2+ элементов
  59. {
  60. cell* tmp = first; // Сохраняем указатель на наш первый
  61. int toReturn = tmp->value; // сохраняем значение, которое нужно вернуть
  62. first = first->next; // Переставляем на следующее место указатель первого (Т.к. нужно удалить первый)
  63. delete tmp; // удаляем наш указатель
  64. return toReturn; // возвращаем значение
  65. }
  66. };
  67.  
  68. void print() // Вывод
  69. {
  70. if (isEmpty()) // Если очередь пустая
  71. {
  72. cout << "Queue is empty" << endl; // сообщаем
  73. return; // завершаем
  74. }
  75.  
  76. cell* tmp = first; // Создаём указатель-бегунок
  77.  
  78. size_t k = 1; // Счётчик для красивого вывода
  79. while (tmp != nullptr) // Пока он не пустой
  80. {
  81. cout << k++ << ") " << tmp->value << endl; // Выводим элемент и одновременно делаем ++
  82. tmp = tmp->next; // делаем шаг
  83. }
  84. }
  85. };
  86.  
  87. int main()
  88. {
  89. try
  90. {
  91. size_t arraySize;
  92. ifstream in("input.txt");
  93. if (!in.is_open())
  94. throw exception("File is not opened");
  95. in >> arraySize;
  96. int* array = new int[arraySize];
  97.  
  98. size_t k = 0;
  99. while (!in.eof())
  100. in >> array[k++];
  101.  
  102. in.close();
  103.  
  104. queue correctQueue;
  105. for (size_t i = 0; i < arraySize; i++)
  106. if (array[i] > 0)
  107. correctQueue.push(array[i]);
  108. for (size_t i = 0; i < arraySize; i++)
  109. if (array[i] <= 0)
  110. correctQueue.push(array[i]);
  111.  
  112. correctQueue.print();
  113. }
  114. catch (exception ex)
  115. {
  116. cout << "Error: " << ex.what() << endl;
  117. }
  118.  
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment