Advertisement
zodiak1

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

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