#include
#include
#include
const char SE = 2; // Стек пуст
enum COMMAND
{
PUSH, // Добавить элемент в стек
POP, // Вытолкнуть элемент из стека
EMPTY, // Проверить, пуст ли стек
CLEAR, // Очистить стек
PRINT, // Вывести содержимое стека на консоль
EXIT // Завершение работы программы
};
struct item
{
item(char _elem = 0, item *_next = NULL) : elem(_elem), next(_next) { }
char elem;
item *next;
};
struct stack
{
private:
item *top = NULL;
public:
///
/// Добавляет элемент в стек.
///
/// Элемент, который нужно добавить в стек.
void push(char e)
{
top = new item(e, top);
}
///
/// Выталкивает последний элемент из стека.
///
/// Ссылка, куда нужно положить вытолкнутый элемент из стека.
/// Код выполнения операции: SE - операция не выполнена (стек пуст), 0 - операция выполнена.
char pop(char &e)
{
bool is_e = empty();
if (!is_e)
{
item *t = top;
e = t->elem;
top = t->next;
delete t;
}
return is_e ? SE : 0;
}
///
/// Проверяет, пустой ли стек.
///
bool empty()
{
return !top;
}
///
/// Очищает стек.
///
void clear()
{
for (char n = 0; !empty(); pop(n));
}
///
/// Выводит все элементы стека на консоль.
///
void print()
{
char e;
stack s;
for (; pop(e) != SE; s.push(e)) printf_s("%c\n", e);
for (; s.pop(e) != SE; push(e));
}
};
int main()
{
UINT inCp = GetConsoleCP(), outCp = GetConsoleOutputCP();
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
stack s;
char cmd, elem;
bool is_repeat = true;
do
{
printf_s("Выберите команду:\n"
"[%d] Добавить элемент в стек;\n"
"[%d] Вытолкнуть элемент из стека;\n"
"[%d] Проверить, пустой ли стек;\n"
"[%d] Очистить стек;\n"
"[%d] Вывести элементы стека;\n"
"[%d] Завершить работу.\n"
"Действие: ", PUSH, POP, EMPTY, CLEAR, PRINT, EXIT);
scanf_s("\n%c", &cmd, 1);
printf_s("\n");
switch (cmd - '0')
{
case PUSH:
printf_s("Введите элемент: ");
scanf_s("\n%c", &elem, 1);
s.push(elem);
printf_s("Элемент успешно добавлен."); break;
case POP:
s.pop(elem) == SE ? printf_s("Не удалось вытолкнуть элемент: стек пуст.")
: printf_s("Вытолкнутый элемент: %c.", elem); break;
case EMPTY:
printf_s(s.empty() ? "Стек пуст." : "Стек не пуст."); break;
case CLEAR:
s.clear();
printf_s("Стек очищен."); break;
case PRINT:
printf_s("Содержимое стека:\n");
s.print(); break;
case EXIT:
is_repeat = false; break;
default:
printf_s("Неверный номер команды."); break;
}
printf_s("\n\n");
} while (is_repeat);
SetConsoleCP(inCp);
SetConsoleOutputCP(outCp);
return 0 * _getch();
}