// stack.h begin here #ifndef _STACK_H_ #define _STACK_H_ typedef int Data; class Stack { public: Stack() : mTop(0) {} ~Stack() { delete mTop; } // look at top element const Data& top() const; // look at and remove top element Data pop(); // put element on top void push(Data&); // number of stored elements unsigned size() const; Stack& operator=(Stack const&); Stack(Stack const&); private: class Elem { public: Elem(Data const& d, Elem* n = 0) : value(d), next(n) {} ~Elem() { delete next; } Elem* clone() const; Data value; Elem* next; }; Elem* mTop; }; #endif // stack.cc begin here #include Stack::Elem* Stack::Elem::clone() const { if ( this != 0) return new Elem(value, next->clone()); else return 0; } Stack& Stack::operator=(Stack const& rhs) { if (this != &rhs) { Stack copy(rhs); Elem* save = mTop; mTop = copy.mTop; copy.mTop = save; } return *this; } Stack::Stack(Stack const& rhs) { mTop = rhs.mTop->clone(); } const Data& Stack::top() const { if (mTop == 0) throw std::out_of_range("FEL: Tom stack"); return mTop->value; } Data Stack::pop() { Data save = top(); Elem* victim = mTop; mTop = mTop->next; victim->next = 0; // stoppa rekursiv delete! delete victim; return save; } void Stack::push(Data& d) { mTop = new Elem(d, mTop); } unsigned Stack::size() const { unsigned sum = 0; for (Elem* c = mTop; c != 0; c = c->next) ++sum; return sum; } // main.cc begin here #include using namespace std; int main() { Stack s; cout << "Mata in 10 heltal: "; // insert things in stack to test it for (int i = 0; i < 10; ++i) { int n; cin >> n; s.push(n); } Stack copy(s); cout << "Talen i omvänd ordning: "; // if they come out reverse the stack works for (int i = 0; i < 10; ++i) { cout << s.pop() << " "; } cout << endl; cout << "Talen i omvänd ordning: "; for (int i = 0; i < 10; ++i) { cout << copy.pop() << " "; } cout << endl; return 0; }