Website Summary Files Commits Branches @commit @diff @stats
path: root / Templates / Queue
diff options
context:
space:
mode:
2 files changed, 144 insertions, 0 deletions
-rw-r--r--Templates/Queue/Queue.hpp121
-rw-r--r--Templates/Queue/main.cpp23
diff --git a/Templates/Queue/Queue.hpp b/Templates/Queue/Queue.hpp
new file mode 100644
index 0000000..128f1df
--- /dev/null
+++ b/Templates/Queue/Queue.hpp
@@ -0,0 +1,121 @@
+#ifndef QUEUE_HDR
+#define QUEUE_HDR
+
+#include <iostream>
+using namespace std;
+
+template<typename T>
+class Queue {
+private:
+ T * arr;
+ int capacity;
+ int count;
+
+ int whereToPut;
+ int whereToGet;
+ void Resize();
+ void CopyFrom(const Queue<T>& other);
+ void Free();
+
+public:
+ Queue();
+ Queue(const Queue<T>& other);
+ Queue<T>& operator=(const Queue<T>& other);
+ ~Queue();
+
+ bool isEmpty() const;
+ void Push(T el);
+ T Pop();
+ T& Peek();
+};
+
+template <typename T>
+void Queue<T>::Resize() {
+ T* temp = new T[capacity * 2];
+ for (int i = 0; i < capacity; ++i)
+ temp[i] = Pop();
+ whereToGet = 0;
+ whereToPut = capacity;
+ count = capacity;
+ capacity *= 2;
+ delete[] arr;
+ arr = temp;
+}
+
+template <typename T>
+void Queue<T>::CopyFrom(const Queue<T>& other) {
+ arr = new T[other.capacity];
+ for (int i = 0; i < other.count; ++i)
+ arr[i] = other.arr[i];
+ count = other.count;
+ capacity = other.capacity;
+ whereToPut = other.whereToPut;
+ whereToGet = other.whereToGet;
+}
+
+template <typename T>
+void Queue<T>::Free() {
+ delete[] arr;
+ count = capacity = 0;
+}
+
+template <typename T>
+Queue<T>::Queue() {
+ arr = new T[4];
+ capacity = 4;
+ count = 0;
+ whereToPut = 0;
+ whereToGet = 0;
+}
+
+template <typename T>
+Queue<T>::Queue(const Queue<T>& other) {
+ CopyFrom(other);
+}
+
+template <typename T>
+Queue<T>& Queue<T>::operator=(const Queue<T>& other) {
+ if (this != &other) {
+ Free();
+ CopyFrom(other);
+ }
+ return *this;
+}
+
+template <typename T>
+Queue<T>::~Queue() {
+ Free();
+}
+
+template <typename T>
+bool Queue<T>::isEmpty() const {
+ return count == 0;
+}
+
+template <typename T>
+void Queue<T>::Push(T el) {
+ if (count == capacity)
+ Resize();
+ arr[whereToPut] = el;
+ (whereToPut += 1) %= capacity;
+ count++;
+}
+
+template <typename T>
+T Queue<T>::Pop() {
+ if (count == 0)
+ throw "Queue is empty";
+ T elToReturn = arr[whereToGet];
+ count--;
+ (whereToGet += 1) %= capacity;
+ return elToReturn;
+}
+
+template <typename T>
+T& Queue<T>::Peek() {
+ if (isEmpty())
+ throw std::logic_error("empty queue");
+ return arr[whereToGet];
+}
+
+#endif // !QUEUE_HDR
diff --git a/Templates/Queue/main.cpp b/Templates/Queue/main.cpp
new file mode 100644
index 0000000..89b8468
--- /dev/null
+++ b/Templates/Queue/main.cpp
@@ -0,0 +1,23 @@
+#include "Queue.hpp"
+
+
+int main()
+{
+ Queue<int> q;
+ q.Enqueue(3);
+ q.Dequeue();
+ q.Enqueue(1);
+ q.Enqueue(2);
+ q.Enqueue(3);
+ q.Enqueue(4);
+ q.Enqueue(5);
+ q.Enqueue(6);
+ cout<<q.Dequeue();
+
+ cout << q.Dequeue();
+ cout << q.Dequeue();
+ cout << q.Dequeue();
+ cout << q.Dequeue();
+ cout << q.Dequeue();
+ return 0;
+}