avr39ripe

PV913circularArrayQueue

Jul 13th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <typename ElemT, int sizeP>
  4. class Queue
  5. {
  6.     ElemT storage[sizeP];
  7.     int backPosition;
  8.     int frontPosition;
  9.     int count;
  10. public:
  11.     Queue() : backPosition{ 0 }, frontPosition{ 0 }, count{0} {};
  12.     int size() const { return sizeP; };
  13.     bool empty() const { return count == 0; };
  14.     bool full() const { return count == sizeP; };
  15.     const ElemT& front() const { return storage[frontPosition]; };
  16.     const ElemT& back() const { return backPosition - 1 < 0 ? storage[sizeP - 1] : storage[backPosition-1]; };
  17.  
  18.     bool push(const ElemT& elem)
  19.     {
  20.         if (!full())
  21.         {
  22.             storage[backPosition] = elem;
  23.             ++backPosition %= sizeP;
  24.             //backPosition = ++backPosition % sizeP;
  25.             ++count;
  26.             return true;
  27.         }
  28.         return false;
  29.     }
  30.  
  31.     bool pop()
  32.     {
  33.         if (!empty())
  34.         {
  35.             ++frontPosition %= sizeP;
  36.             --count;
  37.             return true;
  38.         }
  39.         return false;
  40.     }
  41.  
  42.     template <typename ElementType, int size>
  43.     friend std::ostream& operator<<(std::ostream& out, const Queue<ElementType, size>& queue);
  44. };
  45.  
  46. template <typename ElementType, int size>
  47. std::ostream& operator<<(std::ostream& out, const Queue<ElementType, size>& queue)
  48. {
  49.     if (!queue.empty())
  50.     {
  51.         out << "[ ";
  52.         for (int front{ queue.frontPosition }, cnt{0}; cnt < queue.count; ++front%=queue.size(), ++cnt)
  53.         {
  54.             out << queue.storage[front] << ' ';
  55.         }
  56.         out << " ]\n";
  57.     }
  58.     else
  59.     {
  60.         out << "[empty]\n";
  61.     }
  62.     return out;
  63. };
  64.  
  65.  
  66. int main()
  67. {
  68.     Queue<int, 7> queue;
  69.     std::cout << "Queue: " << queue << '\n';
  70.  
  71.     std::cout << "Pushing into queue..\n";
  72.     for (int i{ 0 }; !queue.full(); ++i)
  73.     {
  74.         queue.push(i);
  75.         std::cout << queue.back() << '\n';
  76.         std::cout << "Queue: " << queue << '\n';
  77.     };
  78.  
  79.     std::cout << "Popping from queue..\n";
  80.     while (!queue.empty())
  81.     {
  82.         std::cout << queue.front() << ' ';
  83.         queue.pop();
  84.         std::cout << "Queue: " << queue << '\n';
  85.     }
  86.  
  87.     std::cout << "Queue: " << queue << '\n';
  88.     std::cout << '\n';
  89.     std::cout << queue.front() << ' ';
  90.     std::cout << queue.front() << ' ';
  91.  
  92. }
Advertisement
Add Comment
Please, Sign In to add comment