Advertisement
zodiak1

DSA_PracticalTask_2

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