Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <conio.h>
- #include <stdio.h>
- #include <locale.h>
- #include <windows.h>
- /// <summary>
- /// N - максимальное число элементов в стеке; S_FULL - код, стек полон; S_EMPTY - код, стек пуст.
- /// </summary>
- const char N = 3, S_FULL = 1, S_EMPTY = 2;
- struct stack
- {
- char top = -1;
- LONGLONG data[N] = { 0 };
- };
- /// <summary>
- /// Добавляет элемент в стек.
- /// </summary>
- /// <param name="s">Стек, в который нужно добавить элемент</param>
- /// <param name="elem">Элемент, который нужно добавить в стек</param>
- /// <returns>Код выполнения операции: S_FULL - операция не выполнена (стек s полон), 0 - операция выполнена</returns>
- int push(stack &s, LONGLONG elem);
- /// <summary>
- /// Берет последний элемент из стека.
- /// </summary>
- /// <param name="s">Стек, из которого нужно взять элемент</param>
- /// <param name="elem">Ссылка, куда нужно положить взятый элемент из стека</param>
- /// <returns>Код выполнения операции: S_EMPTY - операция не выполнена (стек s пуст), 0 - операция выполнена</returns>
- int pop(stack &s, LONGLONG &elem);
- /// <summary>
- /// Проверяет пустой ли стек.
- /// </summary>
- /// <param name="s">Стек, который нужно проверить</param>
- /// <returns>true - пустой, false - не пустой</returns>
- bool is_empty(stack s);
- /// <summary>
- /// Проверяет, полный ли стек.
- /// </summary>
- /// <param name="s">Стек, который нужно проверить</param>
- /// <returns>true - стек полный, false - стек не полный</returns>
- bool is_full(stack s);
- /// <summary>
- /// Очищает стек.
- /// </summary>
- /// <param name="s">Стек, который нужно очистить</param>
- void clear(stack &s);
- /// <summary>
- /// Выводит все элементы стека на консоль.
- /// </summary>
- /// <param name="s">Стек, элементы которого нужно вывести на консоль</param>
- void print(stack &s);
- int main()
- {
- setlocale(0, "");
- stack S = stack {};
- // 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]\tЗавершить работу [6]\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(is_full(S) ? "Стек полон." : "Стек не полон."); break;
- case 3: // Добавить число в стек.
- printf_s("Введите число: ");
- scanf_s("%lld", &n);
- r = push(S, n);
- printf_s(r == S_FULL ? "Не удалось добавить число: стек заполнен." : "Число добавлено."); break;
- case 4: // Взять число из стека.
- r = pop(S, n);
- r == S_EMPTY ? printf_s("Не удалось взять число: стек пуст.") : printf_s("Взятое число: %lld.", n); break;
- case 5: // Распечатать стек.
- print(S); break;
- case 6: // Завершение работы программы.
- process = false; break;
- default: break;
- }
- }
- while(process);
- return 0 * _getch();
- }
- int push(stack &s, LONGLONG elem)
- {
- bool is_f = is_full(s);
- if (!is_f)
- {
- s.top++;
- s.data[s.top] = elem;
- }
- return is_f ? S_FULL : 0;
- }
- int pop(stack &s, LONGLONG &elem)
- {
- bool is_e = is_empty(s);
- if (!is_e)
- {
- elem = s.data[s.top];
- s.data[s.top] = 0;
- s.top--;
- }
- return is_e ? S_EMPTY : 0;
- }
- bool is_empty(stack s)
- {
- return s.top == -1;
- }
- bool is_full(stack s)
- {
- return s.top == N - 1;
- }
- void clear(stack &s)
- {
- for ( ; !is_empty(s); s.top--)
- s.data[s.top] = 0;
- }
- void print(stack &s)
- {
- LONGLONG n = 0;
- stack sb = stack {}; // Стек-буфер.
- while (!is_empty(s)) // Вывод содержимого s.
- {
- pop(s, n);
- printf_s("%lli\n", n);
- push(sb, n);
- }
- while (!is_empty(sb)) // Заполнение пустого s его же элементами.
- {
- pop(sb, n);
- push(s, n);
- }
- }
Add Comment
Please, Sign In to add comment