#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;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: