CCCPaste

Стек и операции с ним. Динамическая ООП реализация.

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