CCCPaste

DSA_Access_2

#include 
#include 
#include 

const int QE = 2;

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

struct item
{
   item(int _elem = 0, item *_next = NULL) : elem(_elem), next(_next) { }

   int elem;
   item *next;
};

struct queue
{
   private:
   item *begin = NULL, *end = NULL;

   public:
   /// 
   /// Добавляет элемент в конец очереди.
   /// 
   /// Элемент, который нужно добавить в очередь.
   void push(char e) { end = (is_empty() ? begin : end->next) = new item(e); }

   /// 
   /// Выталкивает начальный элемент из очереди и передает его в e.
   /// 
   /// Переменная, в которую нужно передать начальный элемент очереди.
   /// Код выполнения операции. Если 2, то операция не выполнена, из-за исчерапания очереди.
   int pop(int &e)
   {
      bool is_e = is_empty();
      if (!is_e)
      {
         item *d = begin;
         e = d->elem;

         begin = begin == end ? end = NULL : begin->next;
         delete d;
      }

      return is_e ? QE : 0;
   }
   /// 
   /// Проверяет, пуста ли очередь.
   /// 
   /// true - пуста, false - не пуста.
   bool is_empty() { return !end; }

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

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

      for ( ; !is_empty(); pop(e), q.push(e), printf_s("%d\n", e));
      for ( ; !q.is_empty(); q.pop(e), push(e));
   }
};

int main()
{
   setlocale(0, "");

   queue Q;
   bool is_repeat = true;
   int a = 0, r = 0, elem = 0;
   
   do
   {
      printf_s("Выберите действие:\nОчистить очередь [%d]\tПроверить, пуста ли очередь [%d]\tДобавить элемент в очередь [%d]\tВзять элемент из очереди[%d]\tРаспечатать содержимое очереди [%d]\tЗавершить работу [%d]\nДействие: ", CLEAR, IS_EMPTY, PUSH, POP, PRINT, EXIT);
      scanf_s("%d", &a);
      printf_s("\n");

      switch (a)
      {
         case CLEAR:
            Q.clear();
            printf_s("Очередь очищена."); break;
         case IS_EMPTY:
            printf_s(Q.is_empty() ? "Очередь пуста." : "Очередь не пуста."); break;
         case PUSH:
            printf_s("Введите элемент: ");
            scanf_s("%d", &elem);

            Q.push(elem);
            printf_s("Элемент успешно добавлен."); break;
         case POP:
            r = Q.pop(elem);
            r == QE ? printf_s("Не удалось взять элемент: очередь пуста.") : printf_s("Взятый элемент: %d.", elem); break;
         case PRINT:
            printf_s("Содержимое очереди:\n");
            Q.print(); break;
         case EXIT:
            is_repeat = false; break;
         default: break;
      }

      printf_s("\n\n");
   } while (is_repeat);

   return 0 * _getch();
}