Advertisement
zodiak1

DSA_PracticalTask_2_Team3_Andrey

Mar 27th, 2022
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.50 KB | None | 0 0
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <windows.h>
  4.  
  5. // Максимальное кол-во элементов в деке.
  6. const UCHAR N = 4;
  7.  
  8. // Команды консольного меню.
  9. enum COMMAND
  10. {
  11.    PUSH_FRONT,  // Добавить элемент в начало дека.
  12.    PUSH_BACK,   // Добавить элемент в конец дека.
  13.    POP_FRONT,   // Вытолкнуть элемент из начала дека.
  14.    POP_BACK,    // Вытолкнуть элемент из конца дека.
  15.    EMPTY,       // Проверить, пуст ли дек.
  16.    FULL,        // Проверить, полон ли дек.
  17.    CLEAR,       // Очистить дек.
  18.    PRINT,       // Вывести все элементы дека на консоль.
  19.    EXIT         // Завершить выполнение программы.
  20. };
  21.  
  22.  
  23. struct deck
  24. {
  25.    private:
  26.    char beg = -1, end = -1, data[N] = { };
  27.  
  28.    public:
  29.    /// <summary>
  30.    /// Добавляет элемент e в начало дека.
  31.    /// </summary>
  32.    /// <param name="e">Элемент, который нужно добавить.</param>
  33.    /// <returns>Выполнилась ли операция.</returns>
  34.    bool push_front(char e)
  35.    {
  36.       bool is_f = full(), is_e = empty();
  37.       if (!is_f)
  38.       {
  39.          beg = is_e ? end = N - 1 : beg == 0 ? N - 1 : beg - 1;
  40.          data[beg] = e;
  41.       }
  42.  
  43.       return !is_f;
  44.    }
  45.    /// <summary>
  46.    /// Добавляет элемент e в конец дека.
  47.    /// </summary>
  48.    /// <param name="e">Элемент, который нужно добавить.</param>
  49.    /// <returns>Выполнилась ли операция.</returns>
  50.    bool push_back(char e)
  51.    {
  52.       bool is_f = full(), is_e = empty();
  53.       if (!is_f)
  54.       {
  55.          end = is_e ? beg = 0 : end == N - 1 ? 0 : end + 1;
  56.          data[end] = e;
  57.       }
  58.  
  59.       return !is_f;
  60.    }
  61.    /// <summary>
  62.    /// Выталкивет элемент из начала дека и передает его в e.
  63.    /// </summary>
  64.    /// <param name="e">Куда передать вытолкнутый элемент.</param>
  65.    /// <returns>Выполнилась ли операция.</returns>
  66.    bool pop_front(char &e)
  67.    {
  68.       bool is_e = empty(), will_e = beg == end;
  69.       if (!is_e)
  70.       {
  71.          e = data[beg];
  72.          beg = will_e ? end = -1 : beg == N - 1 ? 0 : beg + 1;
  73.       }
  74.  
  75.       return !is_e;
  76.    }
  77.    /// <summary>
  78.    /// Выталкивет элемент из начала дека и передает его в e.
  79.    /// </summary>
  80.    /// <param name="e">Куда передать вытолкнутый элемент.</param>
  81.    /// <returns>Выполнилась ли операция.</returns>
  82.    bool pop_back(char &e)
  83.    {
  84.       bool is_e = empty(), will_e = beg == end;
  85.       if (!is_e)
  86.       {
  87.          e = data[end];
  88.          end = will_e ? beg = -1 : end == 0 ? end = N - 1 : end - 1;
  89.       }
  90.  
  91.       return !is_e;
  92.    }
  93.  
  94.    /// <summary>
  95.    /// Проверяет, пуст ли дек.
  96.    /// </summary>
  97.    bool empty() { return beg == -1; }
  98.    /// <summary>
  99.    /// Проверяет, полон ли дек.
  100.    /// </summary>
  101.    bool full() { return beg - end == 1 || end - beg == N - 1; }
  102.    
  103.    /// <summary>
  104.    /// Очищает дек.
  105.    /// </summary>
  106.    void clear() { for (char e = 0; pop_front(e); ); }
  107.    /// <summary>
  108.    /// Выводит элементы дека на консоль.
  109.    /// </summary>
  110.    void print()
  111.    {
  112.       deck d;
  113.       char e = 0;
  114.  
  115.       for ( ; pop_front(e); d.push_back(e)) printf_s("%c ", e);
  116.       for ( ; d.pop_front(e); push_back(e));
  117.    }
  118. };
  119.  
  120.  
  121. int main()
  122. {
  123.    UINT iCp = GetConsoleCP(), oCp = GetConsoleOutputCP();
  124.    SetConsoleCP(1251);
  125.    SetConsoleOutputCP(1251);
  126.  
  127.    deck d;
  128.    bool repeat = true;
  129.    char cmd = 0, elem = 0;
  130.    do
  131.    {
  132.       printf_s("Выберите команду:\n[%d] Добавить элемент в начало дека;\n[%d] Добавить элемент в конец дека;\n[%d] Вытолкнуть элемент из начала дека;\n[%d] Вытолкнуть элемент из конца дека;\n[%d] Проверить, пуст ли дек;\n[%d] Проверить, полон ли дек;\n[%d] Очистить дек;\n[%d] Вывести содержимое дека;\n[%d] Завершить работу.\nКоманда: ", PUSH_FRONT, PUSH_BACK, POP_FRONT, POP_BACK, EMPTY, FULL, CLEAR, PRINT, EXIT);
  133.  
  134.       scanf_s("\n%c", &cmd, 1);
  135.       printf_s("\n");
  136.  
  137.       switch (cmd - '0')
  138.       {
  139.          case PUSH_FRONT:
  140.             printf_s("Введите элемент: ");
  141.             scanf_s("\n%c", &elem, 1);
  142.  
  143.             printf_s(d.push_front(elem) ? "Элемент успешно добавлен."
  144.                                         : "Не удалось добавить элемент: стек полон."); break;
  145.          case PUSH_BACK:
  146.             printf_s("Введите элемент: ");
  147.             scanf_s("\n%c", &elem, 1);
  148.  
  149.             printf_s(d.push_back(elem) ? "Элемент успешно добавлен."
  150.                                        : "Не удалось добавить элемент: стек полон."); break;
  151.          case POP_FRONT:
  152.             d.pop_front(elem) ? printf_s("Вытолкнутый элемент: %c", elem)
  153.                               : printf_s("Не удалось выполнить данную операцию: стек пуст."); break;
  154.          case POP_BACK:
  155.             d.pop_back(elem) ? printf_s("Вытолкнутый элемент: %c", elem)
  156.                              : printf_s("Не удалось выполнить данную операцию: стек пуст."); break;
  157.          case EMPTY:
  158.             printf_s(d.empty() ? "Дек пуст." : "Дек не пуст."); break;
  159.          case FULL:
  160.             printf_s(d.full() ? "Дек полон." : "Дек не полон."); break;
  161.          case CLEAR:
  162.             d.clear();
  163.             printf_s("Дек очищен."); break;
  164.          case PRINT:
  165.             printf_s("Содержимое дека:\n");
  166.             d.print(); break;
  167.          case EXIT:
  168.             repeat = false; break;
  169.          default:
  170.             printf_s("Неверный номер команды."); break;
  171.       }
  172.       printf_s("\n\n");
  173.    } while(repeat);
  174.  
  175.    SetConsoleCP(iCp);
  176.    SetConsoleOutputCP(oCp);
  177.  
  178.    return 0 * _getch();
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement