/* * lstack.cpp * * Created on: 26.03.2015 г. * Author: trifon */ #ifndef LSTACK_CPP_ #define LSTACK_CPP_ #include using namespace std; template struct StackElement { T data; StackElement* next; }; template class LinkedStack { private: StackElement* top; public: // създаване на празен стек LinkedStack(); // конструктор за копиране LinkedStack(LinkedStack const&); // операция за присвояване LinkedStack& operator=(LinkedStack const&); // селектори // проверка дали стек е празен bool empty() const; // намиране на елемента на върха на стека T peek() const; // мутатори // включване на елемент void push(T const&); // изключване на елемент T pop(); // деструктор ~LinkedStack(); }; template LinkedStack::LinkedStack() { top = NULL; } template bool LinkedStack::empty() const { return top == NULL; } template T LinkedStack::peek() const { if (empty()) { cout << "Грешка: опит за поглеждане в празен стек!\n"; return 0; } return top->data; } template void LinkedStack::push(T const& x) { StackElement* p = new StackElement; p->data = x; p->next = top; top = p; } template T LinkedStack::pop() { if (empty()) { cout << "Грешка: опит за изключване от празен стек!\n"; return 0; } // top != NULL StackElement* p = top; top = top->next; T x = p->data; delete p; return x; } template LinkedStack::~LinkedStack() { /* * while (!empty()) pop(); */ StackElement* toDelete; while (top != NULL) { toDelete = top; top = top->next; delete toDelete; } // top == NULL } template LinkedStack::LinkedStack(LinkedStack const& ls) : top(NULL) { /* while (!ls.empty()) { push(ls.pop()); } */ /* StackElement* toCopy = ls.top; while(toCopy != NULL) { push(toCopy->data); toCopy = toCopy->next; } */ *this = ls; // this->operator=(ls); // operator=(ls); } template LinkedStack& LinkedStack::operator=(LinkedStack const& ls) { if (this != &ls) { // !!! ~LinkedStack(); while (!empty()) pop(); StackElement* toCopy = ls.top; StackElement *copy, *lastCopied = NULL; while (toCopy != NULL) { copy = new StackElement; if (top == NULL) top = copy; copy->data = toCopy->data; if (lastCopied != NULL) lastCopied->next = copy; // преместване на указателите lastCopied = copy; toCopy = toCopy->next; } lastCopied->next = NULL; } return *this; } #endif