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