From b6d30951222280286635372971cd29817e518d46 Mon Sep 17 00:00:00 2001 From: PETROVGRIGORIY Date: Sat, 1 Mar 2025 09:49:00 +0000 Subject: [PATCH 1/2] 2, 5 tasks --- task_02/src/stack.cpp | 21 --------- task_02/src/stack.hpp | 93 ++++++++++++++++++++++++++++++------ task_02/src/test.cpp | 61 ++++++++++++------------ task_05/src/heap.hpp | 107 ++++++++++++++++++++++++++++++++++++++++++ task_05/src/test.cpp | 30 +++++++++++- 5 files changed, 244 insertions(+), 68 deletions(-) delete mode 100644 task_02/src/stack.cpp create mode 100644 task_05/src/heap.hpp diff --git a/task_02/src/stack.cpp b/task_02/src/stack.cpp deleted file mode 100644 index 8ca8990..0000000 --- a/task_02/src/stack.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "stack.hpp" - -#include - -void Stack::Push(int value) { data_.push(value); } - -int Stack::Pop() { - auto result = data_.top(); - data_.pop(); - return result; -} - -void MinStack::Push(int value) { data_.push_back(value); } - -int MinStack::Pop() { - auto result = data_.back(); - data_.pop_back(); - return result; -} - -int MinStack::GetMin() { return *std::min_element(data_.begin(), data_.end()); } \ No newline at end of file diff --git a/task_02/src/stack.hpp b/task_02/src/stack.hpp index 138ec40..e828d59 100644 --- a/task_02/src/stack.hpp +++ b/task_02/src/stack.hpp @@ -1,23 +1,88 @@ -#pragma once +#ifndef STACK_H +#define STACK_H #include #include -class Stack { - public: - void Push(int value); - int Pop(); +#include +#include - private: - std::stack data_; +template +class Stack +{ +public: + void push_element(T elem); + T pop_element(); + bool is_empty(){return value_list.size() == 0;} +private: + std::vector value_list; }; -class MinStack { - public: - void Push(int value); - int Pop(); - int GetMin(); +template +void Stack::push_element(T elem) +{ + value_list.push_back(elem); +} - private: - std::vector data_; +template +T Stack::pop_element() +{ + if (value_list.empty()){ + throw std::runtime_error("stack is empty"); + } + T last_element = value_list.back(); + value_list.pop_back(); + return last_element; +} + + + + +template +class MinStack +{ +public: + void push_element(T elem); + T pop_element(); + T get_min(); + bool is_empty(){return value_list.size() == 0;} +private: + std::vector value_list; + std::vector min_list; }; + + +template +void MinStack::push_element(T elem) +{ + value_list.push_back(elem); + if (min_list.empty() || elem < min_list.back()) + { + min_list.push_back(elem); + } +} + +template +T MinStack::pop_element() +{ + if (value_list.empty()){ + throw std::runtime_error("stack is empty"); + } + if (value_list.back() == min_list.back()){ + min_list.pop_back(); + } + T last_element = value_list.back(); + value_list.pop_back(); + return last_element; +} + +template +T MinStack::get_min() +{ + if (min_list.empty()){ + throw std::runtime_error("stack is empty"); + } + return min_list.back(); +} + +#endif //STACK_H \ No newline at end of file diff --git a/task_02/src/test.cpp b/task_02/src/test.cpp index 54e7ce9..a325512 100644 --- a/task_02/src/test.cpp +++ b/task_02/src/test.cpp @@ -1,42 +1,41 @@ #include -#include #include "stack.hpp" TEST(StackTest, Simple) { - Stack stack; - stack.Push(1); // Stack [1] - ASSERT_EQ(stack.Pop(), 1); // Stack [] - stack.Push(1); // Stack [1] - stack.Push(2); // Stack [1, 2] - ASSERT_EQ(stack.Pop(), 2); // Stack [1] - ASSERT_EQ(stack.Pop(), 1); // Stack [] - stack.Push(1); // Stack [1] - stack.Push(2); // Stack [1, 2] - ASSERT_EQ(stack.Pop(), 2); // Stack [1] - stack.Push(3); // Stack [1, 3] - ASSERT_EQ(stack.Pop(), 3); // Stack [1] - ASSERT_EQ(stack.Pop(), 1); // Stack [] + Stack stack; + stack.push_element(1); // Stack [1] + ASSERT_EQ(stack.pop_element(), 1); // Stack [] + stack.push_element(1); // Stack [1] + stack.push_element(2); // Stack [1, 2] + ASSERT_EQ(stack.pop_element(), 2); // Stack [1] + ASSERT_EQ(stack.pop_element(), 1); // Stack [] + stack.push_element(1); // Stack [1] + stack.push_element(2); // Stack [1, 2] + ASSERT_EQ(stack.pop_element(), 2); // Stack [1] + stack.push_element(3); // Stack [1, 3] + ASSERT_EQ(stack.pop_element(), 3); // Stack [1] + ASSERT_EQ(stack.pop_element(), 1); // Stack [] } TEST(MinStackTest, Simple) { - MinStack stack; - stack.Push(1); // Stack [1] - ASSERT_EQ(stack.GetMin(), 1); - ASSERT_EQ(stack.Pop(), 1); // Stack [] - stack.Push(1); // Stack [1] - stack.Push(2); // Stack [1, 2] - ASSERT_EQ(stack.GetMin(), 1); - ASSERT_EQ(stack.Pop(), 2); // Stack [1] - ASSERT_EQ(stack.Pop(), 1); // Stack [] - stack.Push(1); // Stack [1] - stack.Push(2); // Stack [1, 2] - ASSERT_EQ(stack.GetMin(), 1); - ASSERT_EQ(stack.Pop(), 2); // Stack [1] - stack.Push(3); // Stack [1, 3] - ASSERT_EQ(stack.GetMin(), 1); - ASSERT_EQ(stack.Pop(), 3); // Stack [1] - ASSERT_EQ(stack.Pop(), 1); // Stack [] + MinStack stack; + stack.push_element(1); // Stack [1] + ASSERT_EQ(stack.get_min(), 1); + ASSERT_EQ(stack.pop_element(), 1); // Stack [] + stack.push_element(1); // Stack [1] + stack.push_element(2); // Stack [1, 2] + ASSERT_EQ(stack.get_min(), 1); + ASSERT_EQ(stack.pop_element(), 2); // Stack [1] + ASSERT_EQ(stack.pop_element(), 1); // Stack [] + stack.push_element(1); // Stack [1] + stack.push_element(2); // Stack [1, 2] + ASSERT_EQ(stack.get_min(), 1); + ASSERT_EQ(stack.pop_element(), 2); // Stack [1] + stack.push_element(3); // Stack [1, 3] + ASSERT_EQ(stack.get_min(), 1); + ASSERT_EQ(stack.pop_element(), 3); // Stack [1] + ASSERT_EQ(stack.pop_element(), 1); // Stack [] } \ No newline at end of file diff --git a/task_05/src/heap.hpp b/task_05/src/heap.hpp new file mode 100644 index 0000000..eca3788 --- /dev/null +++ b/task_05/src/heap.hpp @@ -0,0 +1,107 @@ +#ifndef HEAP_HPP +#define HEAP_HPP + +#include +#include +#include + +template +class Heap +{ +public: + Heap(std::vector list){for (auto c: list){append_element(c);}} + T pop_min(); + void append_element(T element); +private: + std::vector tree; + + void siftup(); + void siftdown(); + + int parent_index(int index_of_element){return (index_of_element - 1)/2;} + int left_child_index(int index_of_element){return 2*index_of_element+1;} + int right_child_index(int index_of_element){return 2*index_of_element+2;} +}; + + +template +T Heap::pop_min() +{ + if (tree.empty()) {throw std::runtime_error("heap is empty");} + T min_elem = tree[0]; + siftdown(); + return min_elem; +} + + +template +void Heap::append_element(T element) +{ + tree.push_back(element); + siftup(); +} + + +template +void Heap::siftup() +{ + int index = tree.size() - 1; + while (index != 0) + { + int p_ind = parent_index(index); + if (tree[p_ind] > tree[index]) + { + T bufer = tree[index]; + tree[index] = tree[p_ind]; + tree[p_ind] = bufer; + } + index = p_ind; + } +} + + +template +void Heap::siftdown() +{ + if (tree.empty()) return; + tree[0] = tree.back(); + tree.pop_back(); + int index{0}; + while(left_child_index(index) < tree.size()) //существует хотя бы 1 потомок. Если левого потомка нет, то и правого тоже быть не может + { + int l_c_ind = left_child_index(index); + int r_c_ind = right_child_index(index); + if (r_c_ind >= tree.size()) //проверка на существование правого потомка + { + if (tree[l_c_ind] tree[ind_of_min_elem]) + { + std::swap(tree[index], tree[ind_of_min_elem]); + } + index = ind_of_min_elem; + } +} + + + +template +std::vector Heap_sort(std::vector list) +{ + std::vector return_vector; + Heap heap = Heap(list); + while(return_vector.size() != list.size()) + { + return_vector.push_back(heap.pop_min()); + } + return return_vector; +} + +#endif //HEAP_HPP \ No newline at end of file diff --git a/task_05/src/test.cpp b/task_05/src/test.cpp index 5e11617..9a8a38a 100644 --- a/task_05/src/test.cpp +++ b/task_05/src/test.cpp @@ -1,6 +1,32 @@ +#include"heap.hpp" + +#include +#include +#include #include -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +TEST(Heap_sort , int){ + std::vector list = {2,3,1,4,1}; + std::vector sorted_list = Heap_sort(list); + std::sort(begin(list), end(list)); + ASSERT_EQ(sorted_list, list); +} +TEST(Heap_sort, empty_list){ + std::vector list = {}; + std::vector sorted_list = Heap_sort(list); + std::vector expected_list = {}; + ASSERT_EQ(sorted_list, expected_list); +} +TEST(Heap_sort, double){ + std::vector list = {1.1, 2.4, 0.7, 5.6, -23.4}; + std::vector sorted_list = Heap_sort(list); + std::sort(begin(list), end(list)); + ASSERT_EQ(sorted_list, list); } +TEST(Heap_sort, string){ + std::vector list = {"a", "s", "a", "c", "b"}; + std::vector sorted_list = Heap_sort(list); + std::sort(begin(list), end(list)); + ASSERT_EQ(sorted_list, list); +} \ No newline at end of file From ca807462f68d32d9d5d400f222426cc73eb22b51 Mon Sep 17 00:00:00 2001 From: PETROVGRIGORIY Date: Sat, 1 Mar 2025 10:02:28 +0000 Subject: [PATCH 2/2] tasks 2,5 --- task_02/src/stack.cpp | 0 task_05/src/test.cpp | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 task_02/src/stack.cpp diff --git a/task_02/src/stack.cpp b/task_02/src/stack.cpp new file mode 100644 index 0000000..e69de29 diff --git a/task_05/src/test.cpp b/task_05/src/test.cpp index 9a8a38a..7800470 100644 --- a/task_05/src/test.cpp +++ b/task_05/src/test.cpp @@ -6,7 +6,7 @@ #include -TEST(Heap_sort , int){ +TEST(Heap_sort , ints){ std::vector list = {2,3,1,4,1}; std::vector sorted_list = Heap_sort(list); std::sort(begin(list), end(list)); @@ -18,7 +18,7 @@ TEST(Heap_sort, empty_list){ std::vector expected_list = {}; ASSERT_EQ(sorted_list, expected_list); } -TEST(Heap_sort, double){ +TEST(Heap_sort, doubles){ std::vector list = {1.1, 2.4, 0.7, 5.6, -23.4}; std::vector sorted_list = Heap_sort(list); std::sort(begin(list), end(list));