#include <assert.h>
#include<iostream>
using namespace std;
template<class TYPE>
class Stack
{
public:
TYPE *pData;
unsigned elements;
Stack(){ pData=NULL;elements=0;}
Stack(const Stack& theOther){pData=NULL;elements=0; *this=theOther;}
void pop(TYPE& element);
void push(const TYPE& newElement);
bool isEmpty()const{return (elements==0);}
const Stack& operator=(const Stack& theOther);
~Stack(){delete[] pData;}
};
template<class TYPE>
void Stack<TYPE>::push(const TYPE & newElement)
{
TYPE* pTemp=new TYPE[elements+1];
for(unsigned i=0; i<elements;i++)
{
pTemp[i]=pData[i];
}
pTemp[elements]=newElement;
elements++;
delete[] pData;
pData=pTemp;
}
template<class TYPE>
void Stack<TYPE>::pop(TYPE & element)
{
// if(elements==0) return; // Hibakezelés nem kell
element=pData[elements-1];
if(elements==1) // Ha ez volt az utolsó elem
{
delete[] pData;
elements=0;
return;
}
elements --;
TYPE* pTemp=new TYPE[elements];
for(unsigned i=0; i<elements;i++)
{
pTemp[i]=pData[i];
}
delete[] pData;
pData=pTemp;
}
template<class TYPE>
const Stack<TYPE>& Stack<TYPE>::operator=(const Stack<TYPE>& theOther)
{
// assert(this!=&theOther); // Hibakezelés nem kell
delete[]pData;
elements=theOther.elements;
if(elements==0)
{
pData=NULL;
}
else
{
pData=new TYPE[elements];
for(unsigned int i=0;i<elements;i++)
{
pData[i]=theOther.pData[i];
}
}
return *this;
}
/*
int main()
{
// Előírt követelmények:
// - Paraméter nélküli konstruktor (new-val létrehozzuk)
// - Helyesen muködő operator= (másoljuk az elemeket)
// Az osztály szolgáltatásainak bemutatása.
Stack<int>f1; f1.push(1); f1.push(2);
Stack<int>f2(f1); int x; f2.pop(x);
Stack<int>f3; f3=f1; cout<<f3.isEmpty();
return 0;
}
*/