Advertisement
Garey

Dinev Queue

Mar 19th, 2018
500
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template<typename T>
  6. class Queue
  7. {
  8. private:
  9.     int m_capacity;
  10.     int m_size;
  11.     int m_startIndex;
  12.     int m_endIndex;
  13.     T* m_buffer;
  14.  
  15.     void expand_queue() {
  16.         int newCapacity = m_capacity * 2;
  17.         T* newBuffer = new T[newCapacity];
  18.         if (m_endIndex <= m_startIndex) {
  19.             int cnt = 0;
  20.             for (int i = m_startIndex; i < m_capacity; i++) {
  21.                 newBuffer[cnt++] = m_buffer[i];
  22.             }
  23.  
  24.             for (int i = 0; i < m_endIndex; i++) {
  25.                 newBuffer[cnt++] = m_buffer[i];
  26.             }
  27.         } else {
  28.             int cnt = 0;
  29.             for (int i = m_startIndex; i < m_endIndex; i++) {
  30.                 newBuffer[cnt++] = m_buffer[i];
  31.             }            
  32.         }
  33.  
  34.         delete[] m_buffer;
  35.         m_buffer = newBuffer;
  36.         m_startIndex = 0;
  37.         m_endIndex = m_size;
  38.         m_capacity = newCapacity;
  39.     }
  40.  
  41.     void init_queue(int capacity) {
  42.         m_capacity = capacity;
  43.         m_size = 0;
  44.         m_startIndex = 0;
  45.         m_endIndex = 0;
  46.  
  47.         m_buffer = new T[capacity];
  48.     }
  49.  
  50. public:
  51.     Queue() {
  52.         init_queue(32);
  53.     }
  54.  
  55.     Queue(int capacity) {
  56.         init_queue(capacity);
  57.     }
  58.  
  59.     void push(T element) {
  60.         if (m_endIndex == m_startIndex && m_size > 0) {
  61.             // expand queue
  62.             expand_queue();
  63.         }
  64.  
  65.         m_buffer[m_endIndex] = element;
  66.         m_endIndex = (m_endIndex + 1) % m_capacity;
  67.         m_size++;
  68.     }
  69.  
  70.     void pop() {
  71.         if (m_size == 0) {
  72.             return;
  73.         }
  74.  
  75.         m_startIndex = (m_startIndex + 1) % m_capacity;
  76.         m_size--;
  77.     }
  78.  
  79.     T front() {
  80.         if (m_size == 0) {
  81.             throw;
  82.         }
  83.  
  84.         return m_buffer[m_startIndex];
  85.     }
  86.  
  87.     T back() {
  88.         if (m_size == 0) {
  89.             throw;
  90.         }
  91.  
  92.         if (m_endIndex == 0) {
  93.             return m_buffer[m_capacity - 1];
  94.         } else {
  95.             return m_buffer[m_endIndex - 1];
  96.         }
  97.     }
  98.  
  99.     int size() {
  100.         return m_size;
  101.     }
  102. };
  103.  
  104. int main() {
  105.  
  106.     Queue<int> test;
  107.  
  108.     test.push(3);
  109.     test.push(4);
  110.  
  111.     while(test.size()) {
  112.         cout << test.front() << endl;
  113.         test.pop();
  114.     }
  115.  
  116.     system("pause");
  117.  
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement