Open alexey-malov opened 7 years ago
std::shared_ptr<Node> newElement(new Node);
void Copy(std::shared_ptr<Node> lastElement)
{
if (lastElement != nullptr)
{
Copy(lastElement->prevElement);
Push(lastElement->element);
}
}
void Move(std::shared_ptr<Node> lastElement)
{
if (lastElement != nullptr)
{
Move(lastElement->prevElement);
auto copy = std::move(lastElement->element);
Push(copy);
}
}
[x] Со стеком в несколько десятков тысяч элементов закончится стек и программа упадет. Решить задачу копирования стека без использования рекурсии за O(N) по времени и O(1) дополнительной памяти.
[x] Задачу перемещения содержимого одного стека в другой решить за O(1) по времени и O(1) доп. памяти
BOOST_AUTO_TEST_CASE(this_test_will_probably_fail)
{
CMyStack<std::string> s1;
s1.Push("kjhlskjfhsdkljfhslkjfhskljfhs dlfkjhsdlfkjshf 1");
s1.Push("kjhlskjfhsdkljfhslkjfhskljfhs dlfkjhsdlfkjshf 1");
s1.Push("kjhlskjfhsdkljfhslkjfhskljfhs dlfkjhsdlfkjshf 1");
s1.Push("kjhlskjfhsdkljfhslkjfhskljfhs dlfkjhsdlfkjshf 1");
s1 = s1;
BOOST_CHECK_EQUAL(s1.GetSize(), 4);
s1.Pop();
s1.Pop();
s1.Pop();
s1.Pop();
BOOST_CHECK(s1.IsEmpty());
}
void Pop()
{
std::shared_ptr<Node> tmpNode = m_lastElement;
if (IsEmpty())
{
throw std::domain_error("Can't pop element from empty stack.");
}
m_lastElement = m_lastElement->prevElement;
tmpNode.reset();
--m_size;
}
int GetSize()const
{
return(m_size);
}
void Copy(CMyStack const &stack)
{
Clear();
auto tmpNode = stack.m_lastElement;
auto seed = std::make_shared<Node>();
auto prevNode = seed;
seed->element = tmpNode->element;
tmpNode = tmpNode->prevElement;
while (tmpNode != nullptr)
{
auto newNode = std::make_shared<Node>();
newNode->element = tmpNode->element;
prevNode->prevElement = newNode;
prevNode = newNode;
tmpNode = tmpNode->prevElement;
}
m_size = stack.GetSize();
m_lastElement = seed;
}
struct Node
{
T element = T();
std::shared_ptr<Node> prevElement = nullptr;
};
void Move(CMyStack &stack)
{
if (*this != stack)
{
m_lastElement = stack.m_lastElement;
m_size = stack.GetSize();
stack.m_lastElement = nullptr;
stack.m_size = 0;
}
}
BOOST_AUTO_TEST_CASE(can_be_moved_via_assignment_operator)
{
CMyStack<int> newIntStack = (std::move(intStack));
}
Тут у вас вызов перемещающего коснтруктора, а не оператора перемещающего присваивания
void Copy(CMyStack const &stack)
{
auto tmpNode = stack.m_lastElement;
auto seed = std::make_shared<Node>();
auto prevNode = seed;
seed->data = tmpNode->data;
tmpNode = tmpNode->prevNode;
while (tmpNode != nullptr)
{
auto newNode = std::make_shared<Node>();
newNode->data = tmpNode->data;
prevNode->prevNode = newNode;
prevNode = newNode;
tmpNode = tmpNode->prevNode;
}
m_size = stack.GetSize();
m_lastElement = seed;
}