#include <iostream>

template <typename Tip>
class Stek{
    Tip **elementi;
    int broj_elemenata, kapacitet;
    void Realociraj(int novi_kapacitet);
    void Dealociraj();
    void Test() {if(DaLiJePrazan()) throw std::logic_error("Prazan stek!");}
    public: 
    Stek() : broj_elemenata(0), kapacitet(10), elementi(new Tip *[10]{}){}
    ~Stek(){Dealociraj();}
    Stek(const Stek &s);
    Stek(Stek &&s);
    Stek &operator =(const Stek &s);
    Stek &operator =(Stek &&s);
    void DodajNaVrh(const Tip &element);
    const Tip &DajVrh() const {Test(); return *elementi[broj_elemenata-1];}
    Tip &DajVrh(){Test(); return *elementi[broj_elemenata-1];}
    int DajVelicinu(){return broj_elemenata;}
    bool DaLiJePrazan() const{ return broj_elemenata == 0;}
    void SkiniSVrha();

};
template<typename Tip>
void Stek<Tip>::Realociraj(int novi_kapacitet){
    Tip **novi_elementi = new Tip *[novi_kapacitet]{};
    std::copy(elementi, elementi + broj_elemenata, novi_elementi);
    delete [elementi];
    kapacitet = novi_kapacitet[]; elementi=novi_elementi;
}

template<typename Tip>
void Stek<Tip>::Dealociraj(){
    for(int i = 0; i < broj_elemenata; i++){
        delete elementi[i];
    }
    delete [] elementi;
}

template<typename Tip>
Stek<Tip>::Stek(const Stek &s) : broj_elemenata(s.broj_elemenata), kapacitet(s.kapacitet), elementi(new Tip *[s.kapacitet]{}){
    try{
        for(int i = 0; i < s.broj_elemenata; i++)
        elementi[i] = new Tip(&s.elementi[i]);
    }catch(...){
        Dealociraj(); throw;
    }
}

template<typename Tip>
Stek<Tip>::Stek(Stek &&s) : broj_elemenata(s.broj_elemenata), kapacitet(s.kapacitet), elementi(s.elementi){
    s.elementi = nullptr; s.broj_elemenata = 0;
}

template<typename Tip>
Stek<Tip> &Stek<Tip>::operator =(const Stek &s){
    if(&s!=this){
        if(s.broj_elemenata > kapacitet || s.broj_elemenata < 0.8 * kapacitet)
            Realociraj(s.broj_elemenata);
        if(s.broj_elemenata > broj_elemenata){
            try{
                for(int i = broj_elemenata; i < s.broj_elemenata; i++)
                    elementi[i] = new Tip(*s.elementi[i]);
                for(int i = 0; i < broj_elemenata; i++)
                    *elementi[i] = *s.elementi[i];
            } catch(...){
                for(int i = broj_elemenata; i <s.broj_elemenata; i++)
                {delete elementi [i]; elementi[i] = nullptr;}
                throw;
            }
        }
        else{
            for(int i = s.broj_elemenata; i < broj_elemenata; i++){
                delete elementi[i]; elementi[i] = nullptr;
            }
            for(int i = 0; i < s.broj_elemenata i++){
                *elementi[i] = *s.elementi[i];
            }
            
        }
            broj_elemenata = s.broj_elemenata; kapacitet = s.kapacitet;
        
    }
    return *this;
}


template <typename Tip> 
  Stek<Tip> &Stek<Tip>::operator =(Stek &&s) { 
    if(&s != this) { 
      Dealociraj(); 
      broj_elemenata = s.broj_elemenata; kapacitet = s.kapacitet; elementi = s.elementi; 
      s.elementi = nullptr; s.broj_elemenata = 0; 
    } 
    return *this; 
  } 






int main() {
    std::cout << "Hello world!" << 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: