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