#ifndef _stackT_h
#define _stackT_h

#include <iostream.h>
#include <memory.h>
#include <process.h>

template<class T>
class stack
{
public:
unsigned N;
unsigned Size;
T *A;



stack ()
{
N=10;
Size=0;
A = new T [N];
}

stack (const stack<T> &V)
{
A = new T [N=V.N];
if (A==NULL)
{
cout << "Error: \n";
}
else
{
Size=V.Size;
for(unsigned i=0;i<N;i++)
A[i]=V.A[i];
}
}

~stack ()
{
delete []A;
}


T& operator[] (unsigned i) const
{
if ((i<=Size)&&(i>=0))//проверка на существование элемента с заданым индексом
return A[i];
else
{
cout << "Net takogo elementa" << endl;
exit(1);
}
}

void push_back(const T& v)
{
if(N==Size)
resize(Size*2);
A[Size++]=v;
}

void resize(unsigned newsize)
{
if(newsize>N)
{
T *data =new T[newsize];
for(unsigned i=0;i<N;++i)
data[i]=A[i];
delete[] A;
A=data;
N=newsize;
}

}

void push (T symb)
{
if (Size>=N)
{
push_back(symb);
return;
}
else
{
Size=Size+1;
A[Size]=symb;
}
}

T pop()
{
T item;
if(Size==0)
{
cout<<"stack empty"<<endl;
return(0);
}
else
{
item=A[Size];
Size--;
}
return(item);
}
};
#endif