avr39ripe

cppQueueCircularArrayBazhivVladVer

Aug 11th, 2021
732
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Задание 2.
  2.  
  3. Усовершенствовать класс Очередь, Queue https ://pastebin.com/CavnuaiZ избавившись от "тяжелого" смещения копированием всех элементов при извлечении элемента с головы очереди. Динамическую память выделять не надо! Решение может добавлять переменные-члены к классу.
  4.  
  5. #include <iostream>
  6.  
  7. template <typename ElemT, size_t size>
  8. class Queue
  9. {
  10.     ElemT storage[size];
  11.     int backPosition;
  12.     int frontPosition;
  13.     static const int emptyQueue{ -1 };
  14. public:
  15.     Queue() : backPosition{ emptyQueue }, frontPosition{ 0 } {}
  16.     size_t getSize()const { return size; }
  17.     bool empty()const { return backPosition == emptyQueue or frontPosition > backPosition; }
  18.     bool full()const { return backPosition == size - 1; }
  19.     ElemT& front() { return storage[0]; }
  20.     const ElemT& front()const { return storage[0]; }
  21.     size_t getfront()const { return frontPosition; }
  22.     size_t getback()const { return backPosition; }
  23.  
  24.     bool push(const ElemT& elem)
  25.     {
  26.         if (!full())
  27.         {
  28.             storage[++backPosition] = elem;
  29.             return true;
  30.         }
  31.         return false;
  32.     }
  33.  
  34.     bool pop()
  35.     {
  36.         if (!empty())
  37.         {
  38.             //for (size_t i{ 1 }; i <= backPosition; storage[i - 1] = storage[i], ++i);
  39.             ++frontPosition;
  40.  
  41.             return true;
  42.         }
  43.         return false;
  44.     }
  45.  
  46.     template <typename ElemT, size_t size>
  47.     friend std::ostream& operator<<(std::ostream& out, const Queue<ElemT, size>& queue);
  48. };
  49.  
  50.  
  51. template <typename ElemT, size_t size>
  52. std::ostream& operator<<(std::ostream& out, const Queue<ElemT, size>& queue)
  53. {
  54.     if (!queue.empty())
  55.     {
  56.         out << "[ ";
  57.         for (size_t i{ queue.getfront() }; i <= queue.backPosition; ++i)
  58.         {
  59.             out << queue.storage[i] << ' ';
  60.         }
  61.         out << "]\n";
  62.     }
  63.     else
  64.     {
  65.         out << "[empty]\n";
  66.     }
  67.     return out;
  68. }
  69.  
  70. int main()
  71. {
  72.     Queue<int, 8> queue;
  73.     std::cout << queue;
  74.  
  75.     std::cout << "Enqueue...\n";
  76.     for (size_t i{ 0 }; !queue.full(); ++i)
  77.     {
  78.         queue.push(i);
  79.         std::cout << queue;
  80.     }
  81.  
  82.     for (size_t i{ 0 }; i<4; ++i)
  83.     {
  84.         queue.pop();
  85.         std::cout << queue;
  86.     }
  87.  
  88.     std::cout << "Dequeue...\n";
  89.     for (; !queue.empty() and queue.getfront() <= queue.getback(); queue.pop())
  90.     {
  91.         std::cout << queue;
  92.     }
  93.     std::cout << queue;
  94. }
RAW Paste Data