CCCPaste

DSA_PracticalTask_2

#include 
#include 
#include 

enum COMMAND
{
   PUSH,   // Добавить элемент в очередь
   POP,    // Вытолкнуть элемент из очереди
   CLEAR,  // Очистить очередь
   PRINT,  // Вывести содержимое очереди на консоль
   EMPTY,  // Проверить, пуста ли очередь
   EXIT    // Завершение работы программы
};

struct list
{
   list(char _elem = 0, list *_next = NULL, list *_prev = NULL)
      : elem(_elem), next(_next), prev(_prev) { }

   char elem;
   list *next, *prev;
};

struct queue
{
   private:
   list *l = NULL;

   public:
   /// 
   /// Добавляет элемент в конец очереди.
   /// 
   /// Значение элемента, который нужно добавить в очередь.
   void push(char e)
   {
      l->prev = empty() ? l->next = l = new list(e) 
                        : l->prev->next = new list(e, l, l->prev);
   }
   /// 
   /// Выталкивает первый элемент очереди и передает его в e.
   /// 
   /// Переменная, в которую нужно передать вытолкнутый элемент очереди.
   /// true - операцию удалось выполнить, false - операция не выполнена.
   bool pop(char &e)
   {
      bool is_e = empty();

      if (!is_e)
      {
         list *d = l;
         e = d->elem;

         if (l->next == l) l = NULL;
         else
         {
            l = l->next;

            d->prev->next = l;
            l->prev = d->prev;
         }

         delete d;
      }

      return !is_e;
   }

   /// 
   /// Проверяет, пуста ли очередь.
   /// 
   /// true - пуста, false - не пуста.
   bool empty() { return !l; }

   /// 
   /// Очищает очередь от элементов.
   /// 
   void clear() { for (char e = 0; pop(e); ); }

   /// 
   /// Выводит содержимое очереди.
   /// 
   void prchar()
   {
      queue q;
      char e = 0;

      for ( ; pop(e); q.push(e)) printf_s("%c ", e);
      for ( ; q.pop(e); push(e));
   }
};

int main()
{
   UINT inCp = GetConsoleCP(), outCp = GetConsoleOutputCP();
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);

   queue Q;
   bool is_repeat = true;
   do
   {
      char cmd = 0, elem = 0;
      printf_s("Выберите команду:\n"
               "[%d] Добавить элемент в очередь\n"
               "[%d] Вытолкнуть элемент из очереди\n"
               "[%d] Очистить очередь\n"
               "[%d] Вывести содержимое очереди\n"
               "[%d] Проверить, пуста ли очередь\n"
               "[%d] Завершить работу\n"
               "Действие: ", PUSH, POP, CLEAR, PRINT, EMPTY, EXIT);
      scanf_s("\n%c", &cmd, 1);
      printf_s("\n");
      
      switch (cmd - '0')
      {
         case PUSH:
            printf_s("Введите элемент: ");
            scanf_s("\n%c", &elem, 1);

            Q.push(elem);
            printf_s("Элемент успешно добавлен."); break;
         case POP:
            Q.pop(elem) ? printf_s("Взятый элемент: %c.", elem) 
                        : printf_s("Не удалось взять элемент: очередь пуста."); break;
         case CLEAR:
            Q.clear();
            printf_s("Очередь очищена."); break;
         case PRINT:
            printf_s("Содержимое очереди:\n");
            Q.prchar(); break;
         case EMPTY:
            printf_s(Q.empty() ? "Очередь пуста." : "Очередь не пуста."); break;
         case EXIT:
            is_repeat = false; break;
         default: 
            printf_s("Неверный номер команды.");
      }
      
      printf_s("\n\n");
   } while(is_repeat);

   SetConsoleCP(inCp);
   SetConsoleOutputCP(outCp);

   return 0 * _getch();
}