Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <conio.h>
- #include <stdio.h>
- #include <windows.h>
- 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:
- /// <summary>
- /// Добавляет элемент в стек.
- /// </summary>
- /// <param name="e">Элемент, который нужно добавить в стек.</param>
- void push(char e)
- {
- top = new item(e, top);
- }
- /// <summary>
- /// Выталкивает последний элемент из стека.
- /// </summary>
- /// <param name="e">Ссылка, куда нужно положить вытолкнутый элемент из стека.</param>
- /// <returns>Код выполнения операции: SE - операция не выполнена (стек пуст), 0 - операция выполнена.</returns>
- 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;
- }
- /// <summary>
- /// Проверяет, пустой ли стек.
- /// </summary>
- bool empty()
- {
- return !top;
- }
- /// <summary>
- /// Очищает стек.
- /// </summary>
- void clear()
- {
- for (char n = 0; !empty(); pop(n));
- }
- /// <summary>
- /// Выводит все элементы стека на консоль.
- /// </summary>
- 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();
- }
Add Comment
Please, Sign In to add comment