CCCPaste

DSA_PracticalTask_P2_Andrey

#include 
#include 
#include 

const UCHAR N = 7; // Максимальное кол-во элементов в очереди

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

struct item
{
   private:
   int priority;
   
   public:
   item(char _value = 0, int _priority = -1) : value(_value), priority(_priority) { }
   
   char value;
   
   int get_priority() { return priority; };
};

struct queue
{
   private:
   char beg = -1, end = -1;
   item data[N] = { };

   public:
   /// 
   /// Добавляет элемент item в конец очереди
   /// 
   /// Элемент, который нужно добавить
   /// Выполнилась ли операция
   bool push(item i)
   {
      bool is_f = full(), is_e = empty();
      if (!is_f)
      {
         char p = beg;
         for ( ; data[p].get_priority() <= i.get_priority() && p != end + 1; p == N - 1 && p != end ? p = 0 : p++);
         for (char j = end == N - 1 ? 0 : end; j != p - 1; j == 0 && j != p ? j = N - 1 : j--)
            data[j + 1] = data[j];

         data[p] = i;
         end = is_e ? beg = 0 : end == N - 1 ? 0 : end + 1;
      }

      return !is_f;
   }
   /// 
   /// Выталкивет элемент из начала очереди и передает его в item
   /// 
   /// Куда передать вытолкнутый элемент
   /// Выполнилась ли операция
   bool pop(item &i)
   {
      bool is_e = empty(), will_e = beg == end;
      if (!is_e)
      {
         i = data[beg];
         beg = will_e ? end = -1 : beg == N - 1 ? 0 : beg + 1;
      }

      return !is_e;
   }

   /// 
   /// Проверяет, пуста ли очередь
   /// 
   bool empty() { return beg == -1; }
   /// 
   /// Проверяет, полна ли очередь
   /// 
   bool full() { return beg - end == 1 || end - beg == N - 1; }

   /// 
   /// Очищает очередь
   /// 
   void clear() { for (item i = 0; pop(i); ); }
   /// 
   /// Выводит элементы очереди на консоль
   /// 
   void print()
   {
      queue d;
      item i = 0;

      for ( ; pop(i); d.push(i)) printf_s("%c ", i.value);
      for ( ; d.pop(i); push(i));
   }
};


int main()
{
   UINT iCp = GetConsoleCP(), oCp = GetConsoleOutputCP();
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);

   item i;
   queue q;
   int p;
   char cmd, v;
   bool repeat = true;
   do
   {
      printf_s("Выберите команду:\n"
               "[%d] Добавить элемент в очередь;\n"
               "[%d] Вытолкнуть элемент из очереди;\n"
               "[%d] Проверить, пуста ли очередь;\n"
               "[%d] Проверить, полна ли очередь;\n"
               "[%d] Очистить очередь;\n"
               "[%d] Вывести содержимое очереди;\n"
               "[%d] Завершить работу.\n"
               "Команда: ", PUSH, POP, EMPTY, FULL, CLEAR, PRINT, EXIT);

      scanf_s("\n%c", &cmd, 1);
      printf_s("\n");

      switch (cmd - '0')
      {
         case PUSH:
            printf_s("Введите элемент: ");
            scanf_s("\n%c", &v, 1);
            printf_s("Укажите его приоритет: ");
            scanf_s("\n%d", &p); 

            printf_s(q.push(item(v, p)) ? "Элемент успешно добавлен."
                                        : "Не удалось добавить элемент: очередь полна."); break;
         case POP:
            q.pop(i) ? printf_s("Вытолкнутый элемент: %c", i.value)
                        : printf_s("Не удалось выполнить данную операцию: очередь пуста."); break;
         case EMPTY:
            printf_s(q.empty() ? "Очередь пуста." : "Очередь не пуста."); break;
         case FULL:
            printf_s(q.full() ? "Очередь полна." : "Очередь не полна."); break;
         case CLEAR:
            q.clear();
            printf_s("Очередь очищена."); break;
         case PRINT:
            printf_s("Содержимое очереди:\n");
            q.print(); break;
         case EXIT:
            repeat = false; break;
         default:
            printf_s("Неверный номер команды."); break;
      }
      printf_s("\n\n");
   } while (repeat);

   SetConsoleCP(iCp);
   SetConsoleOutputCP(oCp);

   return 0 * _getch();
}