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