diff --git a/task_02/src/stack.cpp b/task_02/src/stack.cpp index 8ca8990..e69de29 100644 --- a/task_02/src/stack.cpp +++ b/task_02/src/stack.cpp @@ -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..7800470 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 , ints){ + 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, 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)); + 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