zodiak1

Стек и операции с ним. Статическая ООП реализация.

Mar 12th, 2022 (edited)
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.89 KB | None | 0 0
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <locale.h>
  4. #include <windows.h>
  5.  
  6. /// <summary>
  7. /// N - максимальное число элементов в стеке; S_FULL - код, стек полон; S_EMPTY - код, стек пуст.
  8. /// </summary>
  9. const char N = 3, S_FULL = 1, S_EMPTY = 2;
  10.  
  11. class Stack
  12. {
  13. private:
  14. char top = -1;
  15. LONGLONG data[N] = { 0 };
  16.  
  17. public:
  18. /// <summary>
  19. /// Добавляет элемент в стек.
  20. /// </summary>
  21. /// <param name="elem">Элемент, который нужно добавить в стек</param>
  22. /// <returns>Код выполнения операции: S_FULL - операция не выполнена (стек s полон), 0 - операция выполнена</returns>
  23. int push(LONGLONG &elem)
  24. {
  25. bool is_f = is_full();
  26.  
  27. if (!is_f)
  28. {
  29. top++;
  30. data[top] = elem;
  31. }
  32. return is_f ? S_FULL : 0;
  33. }
  34. /// <summary>
  35. /// Берет последний элемент из стека.
  36. /// </summary>
  37. /// <param name="elem">Ссылка, куда нужно положить взятый элемент из стека</param>
  38. /// <returns>Код выполнения операции: S_EMPTY - операция не выполнена (стек s пуст), 0 - операция выполнена</returns>
  39. int pop(LONGLONG &elem)
  40. {
  41. bool is_e = is_empty();
  42.  
  43. if (!is_e)
  44. {
  45. elem = data[top];
  46.  
  47. data[top] = 0;
  48. top--;
  49. }
  50.  
  51. return is_e ? S_EMPTY : 0;
  52. }
  53.  
  54. /// <summary>
  55. /// Проверяет пустой ли стек.
  56. /// </summary>
  57. /// <returns>true - пустой, false - не пустой</returns>
  58. bool is_empty()
  59. {
  60. return top == -1;
  61. }
  62. /// <summary>
  63. /// Проверяет, полный ли стек.
  64. /// </summary>
  65. /// <returns>true - стек полный, false - стек не полный</returns>
  66. bool is_full()
  67. {
  68. return top == N - 1;
  69. }
  70.  
  71. /// <summary>
  72. /// Очищает стек.
  73. /// </summary>
  74. void clear()
  75. {
  76. for (; !is_empty(); top--)
  77. data[top] = 0;
  78. }
  79. /// <summary>
  80. /// Выводит все элементы стека на консоль.
  81. /// </summary>
  82. void print()
  83. {
  84. LONGLONG n = 0;
  85. Stack sb; // Стек-буфер.
  86.  
  87. while (!is_empty()) // Вывод содержимого s.
  88. {
  89. pop(n);
  90. printf_s("%lli\n", n);
  91. sb.push(n);
  92. }
  93. while (!sb.is_empty()) // Заполнение пустого this его же элементами.
  94. {
  95. sb.pop(n);
  96. push(n);
  97. }
  98. }
  99. };
  100.  
  101.  
  102. int main()
  103. {
  104. setlocale(0, "");
  105.  
  106. Stack S;
  107.  
  108. // process - продолжать работу программы, f - цикл отрабатывает первый раз.
  109. bool process = true, f = true;
  110. do
  111. {
  112. LONGLONG n = 0;
  113. int a = 0, r = 0;
  114.  
  115. if (!f) // Отступ на консоли после предыдущего круга, чтобы разделять информацию.
  116. printf_s("\n\n");
  117. f = false;
  118.  
  119. printf_s("Выберите действие:\nОчистить стек [0]\tПроверить, пустой ли стек [1]\tПроверить, полный ли стек [2]\tДобавить число в стек [3]\tВзять число из стека[4]\tРаспечатать содержимое стека [5]\tЗавершить работу [6]\nДействие: ");
  120. scanf_s("%d", &a);
  121. printf_s("\n");
  122.  
  123. switch (a)
  124. {
  125. case 0: // Очистить стек.
  126. S.clear();
  127. printf_s("Стек очищен."); break;
  128. case 1: // Проверить, пустой ли стек.
  129. printf_s(S.is_empty() ? "Стек пуст." : "Стек не пуст."); break;
  130. case 2: // Проверить, полный ли стек.
  131. printf_s(S.is_full() ? "Стек полон." : "Стек не полон."); break;
  132. case 3: // Добавить число в стек.
  133. printf_s("Введите число: ");
  134. scanf_s("%lld", &n);
  135.  
  136. r = S.push(n);
  137. printf_s(r == S_FULL ? "Не удалось добавить число: стек заполнен." : "Число добавлено."); break;
  138. case 4: // Взять число из стека.
  139. r = S.pop(n);
  140. r == S_EMPTY ? printf_s("Не удалось взять число: стек пуст.") : printf_s("Взятое число: %lld.", n); break;
  141. case 5: // Распечатать стек.
  142. S.print(); break;
  143. case 6: // Завершение работы программы.
  144. process = false; break;
  145. default: break;
  146. }
  147. } while (process);
  148.  
  149. return 0 * _getch();
  150. }
Add Comment
Please, Sign In to add comment