Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 10 / task1
diff options
context:
space:
mode:
Commit42f59920cf5d300a54f3dae03911dccbd1a86eea (patch)
Author
 angeld55 <angel_dimitriev@abv.bg>
2021-05-12 19:47:03 +0300
Committer
 angeld55 <angel_dimitriev@abv.bg>
2021-05-12 19:47:03 +0300
Files35e54cfd62d1f71b8c6b69d5cabcef3c2a752531 /Sem. 10/task1
Object-oriented_programming_FMI-42f59920cf5d300a54f3dae03911dccbd1a86eea.tar
Object-oriented_programming_FMI-42f59920cf5d300a54f3dae03911dccbd1a86eea.tar.gz
Object-oriented_programming_FMI-42f59920cf5d300a54f3dae03911dccbd1a86eea.zip
Parent75256f8ad62bf73362566fb1484ddd5218774f30 (diff)
sem 11 + split sem 10
2 files changed, 167 insertions, 0 deletions
-rw-r--r--Sem. 10/task1/Queue.hpp144
-rw-r--r--Sem. 10/task1/main.cpp23
diff --git a/Sem. 10/task1/Queue.hpp b/Sem. 10/task1/Queue.hpp
new file mode 100644
index 0000000..1f7f854
--- /dev/null
+++ b/Sem. 10/task1/Queue.hpp
@@ -0,0 +1,144 @@
+#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();
+}
diff --git a/Sem. 10/task1/main.cpp b/Sem. 10/task1/main.cpp
new file mode 100644
index 0000000..e52579a
--- /dev/null
+++ b/Sem. 10/task1/main.cpp
@@ -0,0 +1,23 @@
+#include <iostream>
+#include "Queue.hpp"
+using namespace std;
+
+
+
+int main()
+{
+ Queue<char> q;
+
+ q.enqueue('A');
+ q.enqueue('B');
+ q.enqueue('C');
+ q.enqueue('D');
+ cout << q.dequeue() << endl;
+ q.enqueue('E');
+ q.enqueue('F');
+ cout << q.dequeue() << endl;
+ cout << q.dequeue() << endl;
+ cout << q.dequeue() << endl;
+ cout << q.dequeue() << endl;
+ cout << q.dequeue() << endl;
+} \ No newline at end of file