zodiak1

Стек и операции с ним. Статическая функциональная реализация.

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