zodiak1

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

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