Skip to content
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(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);
16 changes: 12 additions & 4 deletions task_03/src/test.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@

#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>{});
}
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