#include #include "StackT.h" using namespace std; struct StackRecordT{ ItemT data; StackRecordT * next; }; StackT::StackT() { size = 0; top = nullptr; } void DeleteList(StackRecordT * top) { StackRecordT * tmp{top}; while(top != nullptr) { tmp = top; top=top->next; delete tmp; } } StackRecordT * CopyList(StackRecordT * top) { StackRecordT * current{top}; StackRecordT * tmp{nullptr}, * follow{nullptr}, * head{nullptr}; for(current = top; current != nullptr; current = current->next) { tmp = new StackRecordT; tmp->data = current->data; tmp->next = nullptr; if (nullptr == head) { head = tmp; } else { follow->next = tmp; } follow = tmp; } return head; } StackT::StackT(const StackT & other) { cout << "In the copy constructor " << endl; size = other.size; top = CopyList(other.top); } StackT::~StackT(){ DeleteList(top); top = nullptr; size = 0; } StackT & StackT::operator = (const StackT & other){ if (this != &other) { DeleteList(top); top = CopyList(other.top); size = other.size; } return *this; } void StackT::Push(ItemT newData){ StackRecordT * tmp{new StackRecordT}; if (tmp != nullptr) { tmp->data = newData; tmp->next = top; top = tmp; ++size; } } void StackT::Pop(void){ if (nullptr != top) { StackRecordT * tmp{top}; top = top -> next; delete tmp; tmp = nullptr; --size; } else { cerr <<"Error, attempt to pop an empty stack." << endl; } } ItemT StackT::Top(void) const{ ItemT rv{DEFAULT_ITEM_T}; if (nullptr != top) { rv = top->data; } else { cerr <<"Error, attempt to top an empty stack." << endl; } return rv; } size_t StackT::Size(void) const{ return size; }