#include <iostream>
#include <stdexcept>
#include <utility>

template<typename T>
class Stek{

    struct Cvor{
        T element;
        Cvor *veza;
    };

    Cvor *vrh;
    void IzbrisiVrh();

    public:
    
    Stek() : vrh(nullptr){}
    Stek(const Stek &s) = delete;
    Stek &operator= (const Stek &s) = delete;
    Stek(Stek &&s);
    Stek &operator =(Stek &&s);
    ~Stek(){while (vrh != nullptr)IzbrisiVrh();}
    void DodajNaVrh(T x);
    void SkiniSaVrha(){if(vrh == nullptr) throw std::domain_error("Prazan stek"); IzbrisiVrh(); };
    T &DajVrh(){
        if(vrh == nullptr) throw std::domain_error("Prazan stek");
        return vrh ->element;};
    const T &DajVrh() const {
         if(vrh == nullptr) throw std::domain_error("Prazan stek");
        return vrh ->element;
    }
    bool DaLiJePrazan() const{ return vrh == nullptr; }
    int DajVelicinu()const;
      
    
    
};
template <typename T>
Stek<T>::Stek(Stek&& s) : vrh(s.vrh){
    s.vrh=nullptr;
    
}

template <typename T>
Stek<T> &Stek<T>::operator=(Stek&& s) {

    if(this != &s){
    while(vrh != nullptr) IzbrisiVrh();

    vrh = s.vrh;
    s.vrh = nullptr;
    }

    return *this;
    
}


template<typename T>
void Stek<T>::DodajNaVrh(T x){

    Cvor *novi = new Cvor {x, vrh};
    vrh = novi;
    
}

template <typename T>
void Stek<T>::IzbrisiVrh(){
    Cvor *stari = vrh;
    vrh = vrh->veza;
    delete stari;
    
}

template<typename T>
int Stek<T>::DajVelicinu()const{
    int brojac = 0;
    for(auto p = vrh; p != nullptr; p = p->veza)
        brojac++;

    return brojac;
}




int main() {
    Stek<int> s;

    s.DodajNaVrh(3);
    s.DodajNaVrh(5);
    s.DodajNaVrh(8);

    std::cout << "s prije pomjeranja:\n";
    std::cout << "Vrh: " << s.DajVrh() << std::endl;
    std::cout << "Velicina: " << s.DajVelicinu() << std::endl;

    Stek<int> s2(std::move(s));   // pomjerajuci konstruktor

    std::cout << "\ns2 nakon pomjerajuceg konstruktora:\n";
    std::cout << "Vrh: " << s2.DajVrh() << std::endl;
    std::cout << "Velicina: " << s2.DajVelicinu() << std::endl;

    std::cout << "\ns nakon pomjeranja:\n";
    std::cout << "Da li je prazan: " << s.DaLiJePrazan() << std::endl;

    Stek<int> s3;
    s3.DodajNaVrh(100);
    s3.DodajNaVrh(200);

    std::cout << "\ns3 prije pomjerajuce dodjele:\n";
    std::cout << "Vrh: " << s3.DajVrh() << std::endl;
    std::cout << "Velicina: " << s3.DajVelicinu() << std::endl;

    s3 = std::move(s2);           // pomjerajuci operator dodjele

    std::cout << "\ns3 nakon pomjerajuce dodjele:\n";
    std::cout << "Vrh: " << s3.DajVrh() << std::endl;
    std::cout << "Velicina: " << s3.DajVelicinu() << std::endl;

    std::cout << "\ns2 nakon pomjerajuce dodjele:\n";
    std::cout << "Da li je prazan: " << s2.DaLiJePrazan() << std::endl;

    s3.DajVrh() = 999;            // test da nekonstantni DajVrh vraca referencu

    std::cout << "\ns3 nakon izmjene vrha:\n";
    std::cout << "Vrh: " << s3.DajVrh() << std::endl;

    return 0;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: