Skip to content

homework 2 #46

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open
29 changes: 29 additions & 0 deletions lib/src/util.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include <functional>
#include <random>
#include <vector>

template <typename T>
static std::size_t Partition(std::vector<T>& data, std::size_t left,
std::size_t right) {
std::function<std::size_t(std::size_t, std::size_t)> RandomPivotIndex =
[&](std::size_t left, std::size_t right) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(left, right);
return dis(gen);
};

std::size_t pivot_index = RandomPivotIndex(left, right);
std::swap(data[pivot_index], data[right]);
std::size_t index = left;

for (std::size_t i = left; i < right; i++) {
if (data[i] < data[right]) {
std::swap(data[i], data[index]);
index++;
}
}

std::swap(data[right], data[index]);
return index;
}
1 change: 1 addition & 0 deletions task_02/src/list_stack.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#include "list_stacks.hpp"
65 changes: 65 additions & 0 deletions task_02/src/list_stacks.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#pragma once

#include <list>
#include <stdexcept>

template <typename T>
class Stack final {
public:
constexpr Stack() noexcept {}
Stack(const Stack& other) : list_(other.list_) {}
Stack(Stack&& other) : list_(std::move(other.list_)) { other.list_.clear(); }
Stack(const std::initializer_list<T>& init_list) : list_(init_list) {}

~Stack() = default;

void Push(const T& value) { list_.push_back(value); }
void Pop() {
if (Empty()) throw std::underflow_error("Stack is empty!");
list_.pop_back();
}

T& Top() {
if (Empty()) throw std::underflow_error("Stack is empty!");
return list_.back();
}
bool Empty() { return list_.empty(); }
std::size_t Size() { return list_.size(); }

private:
std::list<T> list_;
};

template <typename T>
class StackMin final {
public:
constexpr StackMin() noexcept {}
StackMin(const StackMin& other) : list_(other.list_) {}
StackMin(StackMin&& other) : list_(other.list_) { other.list_.clear(); }
StackMin(const std::initializer_list<T>& init_list_) : list_(init_list_) {}

~StackMin() = default;

void Push(const T& value) {
if (min_stack.Empty() || min_stack.Top() > value) min_stack.Push(value);
list_.push_back(value);
}
void Pop() {
if (Empty()) throw std::underflow_error("Stack is empty!");
if (min_stack.Top() == list_.back()) min_stack.Pop();
list_.pop_back();
}

T& Top() {
if (Empty()) throw std::underflow_error("Stack is empty!");
return list_.back();
}
bool Empty() { return list_.empty(); }
std::size_t Size() { return list_.size(); }

T& Min() { return min_stack.Top(); }

private:
std::list<T> list_;
Stack<T> min_stack;
};
21 changes: 0 additions & 21 deletions task_02/src/stack.cpp

This file was deleted.

23 changes: 0 additions & 23 deletions task_02/src/stack.hpp

This file was deleted.

87 changes: 54 additions & 33 deletions task_02/src/test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,62 @@
#include <gtest/gtest.h>

#include <stack>
#include <stdexcept>

#include "stack.hpp"
#include "list_stacks.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 []
TEST(StackTest, test1) {
Stack<int> stack;
stack.Push(1);
stack.Pop();
EXPECT_THROW(stack.Pop(), std::underflow_error);
stack.Push(1);
stack.Push(2);
ASSERT_EQ(stack.Top(), 2);
ASSERT_EQ(stack.Top(), 2);
stack.Push(1000);
stack.Push(21412);
stack.Pop();
stack.Pop();
stack.Pop();
stack.Pop();
EXPECT_THROW(stack.Pop(), std::underflow_error);
EXPECT_THROW(stack.Top(), std::underflow_error);
stack.Push(1);
stack.Push(3);
ASSERT_EQ(stack.Top(), 3);
stack.Pop();
ASSERT_EQ(stack.Top(), 1);
}

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 []
TEST(MinStackTest, test2) {
StackMin<int> stack;
stack.Push(1);
stack.Pop();
EXPECT_THROW(stack.Pop(), std::underflow_error);
stack.Push(1);
stack.Push(2);
ASSERT_EQ(stack.Top(), 2);
ASSERT_EQ(stack.Top(), 2);
stack.Push(1000);
stack.Push(21412);
ASSERT_EQ(stack.Min(), 1);
stack.Pop();
stack.Pop();
stack.Pop();
stack.Pop();
EXPECT_THROW(stack.Min(), std::underflow_error);
EXPECT_THROW(stack.Pop(), std::underflow_error);
EXPECT_THROW(stack.Top(), std::underflow_error);
stack.Push(1);
stack.Push(3);
ASSERT_EQ(stack.Top(), 3);
stack.Pop();
ASSERT_EQ(stack.Top(), 1);
stack.Push(-10);
stack.Push(-102410);
stack.Push(10432140);
stack.Push(0);
stack.Push(-1010);
ASSERT_EQ(stack.Min(), -102410);
}
14 changes: 14 additions & 0 deletions task_03/src/temperature.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "temperature.hpp"

std::vector<int> TemperatureCounter(std::vector<double> temps) {
std::stack<Day> days;
std::vector<int> result(temps.size(), 0);
for (int i = 0; i < temps.size(); i++) {
while (!days.empty() && days.top().value < temps[i]) {
result[days.top().index] = i - days.top().index;
days.pop();
}
days.push(Day(i, temps[i]));
}
return result;
}
11 changes: 11 additions & 0 deletions task_03/src/temperature.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once
#include <stack>
#include <vector>

struct Day {
int index;
double value;
Day(int index, double value) : index(index), value(value) {}
};

std::vector<int> TemperatureCounter(std::vector<double> temps);
18 changes: 14 additions & 4 deletions task_03/src/test.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@

#include <gtest/gtest.h>

#include "topology_sort.hpp"
#include "temperature.hpp"

TEST(TopologySort, Simple) {
ASSERT_EQ(1, 1); // Stack []
}
TEST(TemperatureCnt, Simple) {
ASSERT_EQ(TemperatureCounter(std::vector<double>{5.8, 7.2, 4.1, 5.999}),
(std::vector<int>{1, 0, 1, 0}));
ASSERT_EQ(
TemperatureCounter(std::vector<double>{5.99, 12, 4, 9.1, 5.15, 4, 2}),
(std::vector<int>{1, 0, 1, 0, 0, 0, 0}));
ASSERT_EQ(
TemperatureCounter(std::vector<double>{2, 6, 17.512512, 7, 3, 4.412151}),
(std::vector<int>{1, 1, 0, 0, 1, 0}));
ASSERT_EQ(TemperatureCounter(std::vector<double>{}), std::vector<int>{});
ASSERT_EQ(TemperatureCounter(std::vector<double>{2, 6, 5, 4, 3, 7}),
(std::vector<int>{1, 4, 3, 2, 1, 0}));
}
1 change: 0 additions & 1 deletion task_03/src/topology_sort.cpp

This file was deleted.

1 change: 0 additions & 1 deletion task_03/src/topology_sort.hpp

This file was deleted.

Loading
Loading