// Стек и операции с ним. Динамическая функциональная реализация. #include #include #include #include /// /// Код, стек пуст. /// const char S_EMPTY = 2; struct stack { stack(LONGLONG _elem = 0, stack *_next = NULL) : elem(_elem), next(_next) {} LONGLONG elem = 0; stack *next = NULL; }; /// /// Добавляет элемент в стек. /// /// Стек, в который нужно добавить элемент /// Элемент, который нужно добавить в стек /// Код выполнения операции: S_FULL - операция не выполнена (стек s полон), 0 - операция выполнена void push(stack **s, LONGLONG elem); /// /// Берет последний элемент из стека. /// /// Стек, из которого нужно взять элемент /// Ссылка, куда нужно положить взятый элемент из стека /// Код выполнения операции: S_EMPTY - операция не выполнена (стек s пуст), 0 - операция выполнена int pop(stack **s, LONGLONG &elem); /// /// Проверяет пустой ли стек. /// /// Стек, который нужно проверить /// true - пустой, false - не пустой bool is_empty(stack *s); /// /// Очищает стек. /// /// Стек, который нужно очистить void clear(stack **s); /// /// Выводит все элементы стека на консоль. /// /// Стек, элементы которого нужно вывести на консоль void print(stack **s); int main() { setlocale(0, ""); stack *S = NULL; // process - продолжать работу программы, f - цикл отрабатывает первый раз. bool process = true, f = true; do { LONGLONG n = 0; int a = 0, r = 0; if (!f) // Отступ на консоли после предыдущего круга, чтобы разделять информацию. printf_s("\n\n"); f = false; printf_s("Выберите действие:\nОчистить стек [0]\tПроверить, пустой ли стек [1]\tДобавить число в стек [2]\tВзять число из стека[3]\tРаспечатать содержимое стека [4]\tЗавершить работу [5]\nДействие: "); scanf_s("%d", &a); printf_s("\n"); switch (a) { case 0: // Очистить стек. clear(&S); printf_s("Стек очищен."); break; case 1: // Проверить, пустой ли стек. printf_s(is_empty(S) ? "Стек пуст." : "Стек не пуст."); break; case 2: // Добавить число в стек. printf_s("Введите число: "); scanf_s("%lld", &n); push(&S, n); printf_s("Число добавлено."); break; case 3: // Взять число из стека. r = pop(&S, n); r == S_EMPTY ? printf_s("Не удалось взять число: стек пуст.") : printf_s("Взятое число: %lld.", n); break; case 4: // Распечатать стек. printf_s("Содержимое стека:\n"); print(&S); break; case 5: // Заверешение работы программы. process = false; break; default: break; } } while(process); return 0 * _getch(); } void push(stack **s, LONGLONG elem) { *s = new stack(elem, *s); } int pop(stack **s, LONGLONG &elem) { bool is_e = is_empty(*s); if (!is_e) { stack *t = *s; elem = t->elem; *s = t->next; delete t; } return is_e ? S_EMPTY : 0; } bool is_empty(stack *s) { return !s; } void clear(stack **s) { for (LONGLONG n = 0 ; !is_empty(*s); pop(s, n)); } void print(stack **s) { LONGLONG n = 0; stack *sb = NULL; // Стек-буфер. while (!is_empty(*s)) { pop(s, n); push(&sb, n); printf_s("%lld\n", n); } while (!is_empty(sb)) // Заполнение пустого s его же элементами. { pop(&sb, n); push(s, n); } }