zodiak1

DSA_PracticalTask_P2_Andrey

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