#include #include #include using namespace std; typedef string Data; // GIVEN KOD - ÄNDRAS INTE class Stack { public: Stack() : mTop(nullptr) {} const Data& top() const; Data pop(); void push(Data const&); unsigned size() const; // IMPLEMENTERAS I HUVUDUPPGIFT Stack(Stack const&); ~Stack(); // TILLDELNINGSOPERATOR FÅR LÄGGAS TILL HÄR private: // GIVEN KOD - ÄNDRAS INTE class Elem { public: Elem(Data const& d, Elem* n = nullptr) : value(d), next(n) {} Data value; Elem* next; // IMPLEMENTERAS KANSKE I HUVUDUPPGIFT ~Elem(); Elem* clone() const; }; Elem* mTop; }; // IMPLEMENTERAS KANSKE I HUVUDUPPGIFT Stack::Elem::~Elem() { } // IMPLEMENTERAS KANSKE I HUVUDUPPGIFT Stack::Elem* Stack::Elem::clone() const { return nullptr; } // IMPLEMENTERAS I HUVUDUPPGIFT Stack::Stack(Stack const& rhs) { } // IMPLEMENTERAS I HUVUDUPPGIFT Stack::~Stack() { } // GIVEN KOD - ÄNDRAS INTE const Data& Stack::top() const { if (mTop == nullptr) throw std::out_of_range("FEL: Tom stack"); return mTop->value; } // GIVEN KOD - ÄNDRAS INTE Data Stack::pop() { Data save = top(); Elem* victim = mTop; mTop = mTop->next; victim->next = nullptr; // stoppa rekursiv delete! delete victim; return save; } // GIVEN KOD - ÄNDRAS INTE void Stack::push(Data const& d) { mTop = new Elem(d, mTop); } // GIVEN KOD - ÄNDRAS INTE unsigned Stack::size() const { unsigned sum = 0; for (Elem* c = mTop; c != nullptr; c = c->next) ++sum; return sum; } // GIVEN KOD - ÄNDRAS INTE int main() { Stack s; cout << "Mata in Data, avsluta med Ctrl+D: "; // fyll på stacken med Data Data n; while (cin >> n) { s.push(n); } // kopiera till ny stack Stack copy(s); Stack t; // utskriften skall komma i omvänd ordning cout << "Data i omvänd ordning: "; while ( s.size() > 0 ) { t.push(s.top()); cout << s.pop() << " "; } cout << endl; cin.clear(); cout << "Vill du testa tilldelning? (y/N) "; string line; getline(cin, line); if (line.size() > 0 && line.at(0) == 'y') { copy = t; cout << "Data i rätt ordning: "; } else { cout << "Data i omvänd ordning igen: "; } while ( copy.size() > 0 ) { t.push(copy.top()); cout << copy.top() << " "; copy.pop(); } cout << endl; return 0; }