#include <iostream>

template <typename Tip>
class Stek{

    int broj_elemenata, kapacitet;
    Tip **elementi;
    void Realociraj();
    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() const{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 < s.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;
}

template <typename Tip>
void Stek<Tip>::DodajNaVrh(const Tip &element){
    if(broj_elemenata == kapacitet) Realociraj(kapacitet * 1.5);
    elementi[broj_elemenata] = element;
    broj_elemenata++;
}

template<typename Tip>
void Stek<Tip>SkiniSVrha(){
    if(DaLiJePrazan()) return;
    delete elementi[broj_elemenata -1];
    elementi[broj_elemenata - 1] = nullptr;
    broj_elemenata--;
    if(broj_elemenata <= int(0.3*kapacitet) && kapacitet > 10) Realociraj(0.5 * kapacitet);


}






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: