#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;
class Stack
{
private:
char top = -1;
LONGLONG data[N] = { 0 };
public:
/// <summary>
/// Добавляет элемент в стек.
/// </summary>
/// <param name="elem">Элемент, который нужно добавить в стек</param>
/// <returns>Код выполнения операции: S_FULL - операция не выполнена (стек s полон), 0 - операция выполнена</returns>
int push(LONGLONG &elem)
{
bool is_f = is_full();
if (!is_f)
{
top++;
data[top] = elem;
}
return is_f ? S_FULL : 0;
}
/// <summary>
/// Берет последний элемент из стека.
/// </summary>
/// <param name="elem">Ссылка, куда нужно положить взятый элемент из стека</param>
/// <returns>Код выполнения операции: S_EMPTY - операция не выполнена (стек s пуст), 0 - операция выполнена</returns>
int pop(LONGLONG &elem)
{
bool is_e = is_empty();
if (!is_e)
{
elem = data[top];
data[top] = 0;
top--;
}
return is_e ? S_EMPTY : 0;
}
/// <summary>
/// Проверяет пустой ли стек.
/// </summary>
/// <returns>true - пустой, false - не пустой</returns>
bool is_empty()
{
return top == -1;
}
/// <summary>
/// Проверяет, полный ли стек.
/// </summary>
/// <returns>true - стек полный, false - стек не полный</returns>
bool is_full()
{
return top == N - 1;
}
/// <summary>
/// Очищает стек.
/// </summary>
void clear()
{
for (; !is_empty(); top--)
data[top] = 0;
}
/// <summary>
/// Выводит все элементы стека на консоль.
/// </summary>
void print()
{
LONGLONG n = 0;
Stack sb; // Стек-буфер.
while (!is_empty()) // Вывод содержимого s.
{
pop(n);
printf_s("%lli\n", n);
sb.push(n);
}
while (!sb.is_empty()) // Заполнение пустого this его же элементами.
{
sb.pop(n);
push(n);
}
}
};
int main()
{
setlocale(0, "");
Stack S;
// 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: // Очистить стек.
S.clear();
printf_s("Стек очищен."); break;
case 1: // Проверить, пустой ли стек.
printf_s(S.is_empty() ? "Стек пуст." : "Стек не пуст."); break;
case 2: // Проверить, полный ли стек.
printf_s(S.is_full() ? "Стек полон." : "Стек не полон."); break;
case 3: // Добавить число в стек.
printf_s("Введите число: ");
scanf_s("%lld", &n);
r = S.push(n);
printf_s(r == S_FULL ? "Не удалось добавить число: стек заполнен." : "Число добавлено."); break;
case 4: // Взять число из стека.
r = S.pop(n);
r == S_EMPTY ? printf_s("Не удалось взять число: стек пуст.") : printf_s("Взятое число: %lld.", n); break;
case 5: // Распечатать стек.
S.print(); break;
case 6: // Завершение работы программы.
process = false; break;
default: break;
}
} while (process);
return 0 * _getch();
}