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