#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(); }