#include #include #include "stack.h" Stack::Stack() : first(nullptr) { } Stack::~Stack() { delete first; } Stack::Stack(Stack const& s) : first{(s.first ? new Element{*s.first} : nullptr)} { } Stack::Stack(Stack&& s) : first{s.first} { s.first = nullptr; } Stack& Stack::operator=(Stack const& rhs) { Stack copy{rhs}; std::swap(copy.first, first); return *this; } Stack& Stack::operator=(Stack&& rhs) { std::swap(rhs.first, first); return *this; } bool Stack::empty() const { return first == nullptr; } void Stack::push(int const& i) { first = new Element(i, first); } void Stack::pop() { if ( empty() ) { throw Empty_Stack("empty stack"); } Element* victim{ first }; first = victim->next; victim->next = nullptr; delete victim; } int Stack::top() const { if ( empty() ) { throw Empty_Stack("empty stack"); } return first->data; } Stack::Element::Element(int const& i, Element* n) : data{i}, next{n} { } Stack::Element::~Element() { delete next; } Stack::Element::Element(Element const& e) : data{e.data}, next{e.next ? new Element{*e.next} : nullptr} { }