Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 12 / task1 / Queue
diff options
context:
space:
mode:
Commitbe9dc71f94c40127657723e2881b9929c297a736 (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2021-05-14 14:21:20 +0300
Committer
 angeld55 <angel_dimitriev@abv.bg>
2021-05-14 14:21:20 +0300
Filesf94484f124775ad7e0bbf25da75ccf2bd84ba33b /Sem. 12/task1/Queue
Object-oriented_programming_FMI-be9dc71f94c40127657723e2881b9929c297a736.tar
Object-oriented_programming_FMI-be9dc71f94c40127657723e2881b9929c297a736.tar.gz
Object-oriented_programming_FMI-be9dc71f94c40127657723e2881b9929c297a736.zip
Parentf8ddb55bb214bcf39a0383f7556ff1a8a00560ac (diff)
sem 12
1 files changed, 145 insertions, 0 deletions
-rw-r--r--Sem. 12/task1/Queue/Queue.hpp145
diff --git a/Sem. 12/task1/Queue/Queue.hpp b/Sem. 12/task1/Queue/Queue.hpp
new file mode 100644
index 0000000..e47460a
--- /dev/null
+++ b/Sem. 12/task1/Queue/Queue.hpp
@@ -0,0 +1,145 @@
+#pragma once
+#include <iostream>
+
+template <typename T>
+class Queue
+{
+ T* data;
+ size_t capacity;
+ size_t count;
+
+ size_t head; //where to get
+ size_t tail; //last added element;
+
+ void resize(size_t newCapacity);
+
+ void copyFrom(const Queue<T>& other);
+ void free();
+public:
+ Queue();
+
+ Queue(const Queue<T>& other);
+ Queue<T>& operator=(const Queue<T>& other);
+
+ void enqueue(const T& obj);
+ T dequeue();
+
+ size_t getCount();
+ size_t isEmpty();
+
+ ~Queue();
+};
+
+template <typename T>
+Queue<T>::Queue()
+{
+ capacity = 4;
+ data = new T[capacity];
+
+ count = 0;
+ head = tail = 0;
+}
+
+
+
+template <typename T>
+void Queue<T>::enqueue(const T& obj)
+{
+ if (count == capacity)
+ resize(capacity * 2);
+ if (count != 0)
+ tail++;
+
+ tail %= capacity; //so we don't get an out of range exception
+
+ data[tail] = obj;
+
+ count++;
+}
+
+template <typename T>
+T Queue<T>::dequeue()
+{
+ if (count == 0)
+ throw std::exception("The collection is empty!");
+
+ T toReturn = data[head];
+ (++head) %= capacity;
+
+ count--;
+
+ return toReturn;
+}
+
+template <typename T>
+size_t Queue<T>::getCount()
+{
+ return count;
+}
+
+template <typename T>
+size_t Queue<T>::isEmpty()
+{
+ return getCount() == 0;
+}
+
+template <typename T>
+void Queue<T>::resize(size_t newCapacity)
+{
+ T* newData = new T[newCapacity];
+
+ for (int i = 0, ind = head; i < count; i++, (++ind) %= capacity)
+ newData[i] = data[ind];
+
+ delete[] data;
+ capacity = newCapacity;
+ data = newData;
+
+ head = 0;
+ tail = count - 1;
+}
+
+template <typename T>
+void Queue<T>::copyFrom(const Queue<T>& other)
+{
+ data = new T[other.capacity];
+ for (int i = 0; i < other.capacity; i++)
+ data[i] = other.data[i];
+
+ head = other.head;
+ tail = other.tail;
+
+ count = other.count;
+ capacity = other.capacity;
+
+}
+
+template <typename T>
+void Queue<T>::free()
+{
+ delete[] data;
+}
+
+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();
+}