From 2a8bf5b484ae5eb05bbaaeaf613089dc4a15f73a Mon Sep 17 00:00:00 2001 From: Syndamia Date: Thu, 5 May 2022 11:29:29 +0300 Subject: Solved dimitriev hw (sem 10, ex2) --- .../Solutions Sem. 10/ex2/kPriorityQueue.hpp | 140 +++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Year 1/Object-oriented Programming/Solutions Sem. 10/ex2/kPriorityQueue.hpp (limited to 'Year 1/Object-oriented Programming/Solutions Sem. 10/ex2/kPriorityQueue.hpp') diff --git a/Year 1/Object-oriented Programming/Solutions Sem. 10/ex2/kPriorityQueue.hpp b/Year 1/Object-oriented Programming/Solutions Sem. 10/ex2/kPriorityQueue.hpp new file mode 100644 index 0000000..14cdcc4 --- /dev/null +++ b/Year 1/Object-oriented Programming/Solutions Sem. 10/ex2/kPriorityQueue.hpp @@ -0,0 +1,140 @@ +#include "Queue.hpp" +#include + +template +class kPriorityQueue +{ + MyQueue* priorities; + size_t size; + size_t largestPriority; // за да може peek да се изпълни за константно време + + void free(); + void copyFrom(const kPriorityQueue& other); +public: + kPriorityQueue(size_t k); + + void push(const T& obj, size_t kth); + void push(T&& obj, size_t kth); + void pop(); + + const T& peek() const; + bool isEmpty() const; + + kPriorityQueue(); + kPriorityQueue(const kPriorityQueue& other); + kPriorityQueue& operator=(const kPriorityQueue& other); + ~kPriorityQueue(); +}; + +template +kPriorityQueue::kPriorityQueue(size_t k) +{ + size = k; + priorities = new MyQueue[size]; + largestPriority = size - 1; +} + + +template +void kPriorityQueue::push(const T& obj, size_t kth) +{ + if (kth >= size) + throw std::invalid_argument("Error! No such priority!"); + + priorities[kth].push(obj); + if (kth > largestPriority) + largestPriority = kth; +} + +template +void kPriorityQueue::push(T&& obj, size_t kth) +{ + if (kth >= size) + throw std::invalid_argument("Error! No such priority!"); + + priorities[kth].push(obj); + if (kth > largestPriority) + largestPriority = kth; +} + +template +void kPriorityQueue::pop() +{ + if (isEmpty()) + throw std::logic_error("Empty priority queue!"); + + bool success = false; + while (!success) + { + try + { + priorities[largestPriority].pop(); + success = true; + + if (priorities[largestPriority].isEmpty()) + largestPriority--; + } + catch (std::logic_error e) + { + largestPriority--; + } + } +} + + +template +const T& kPriorityQueue::peek() const +{ + return priorities[largestPriority].peek(); +} + +template +bool kPriorityQueue::isEmpty() const +{ + return size == 0; +} + + +template +kPriorityQueue::kPriorityQueue() : kPriorityQueue(1) +{} + +template +kPriorityQueue::kPriorityQueue(const kPriorityQueue& other) +{ + copyFrom(other); +} + +template +kPriorityQueue& kPriorityQueue::operator=(const kPriorityQueue& other) +{ + if (this != &other) + { + free(); + copyFrom(other); + } + return *this; +} + +template +kPriorityQueue::~kPriorityQueue() +{ + free(); +} + + +template +void kPriorityQueue::free() +{ + delete[] priorities; +} + +template +void kPriorityQueue::copyFrom(const kPriorityQueue& other) +{ + priorities = new MyQueue[other.size]; + for (size_t i = 0; i < other.size; i++) + priorities[i] = other.priorities[i]; + size = other.size; + largestPriority = other.largestPriority; +} -- cgit v1.3.1-26-gb76a