#ifndef _STACK_H_
#define _STACK_H_
#include <iostream>
using std::cout;
using std::endl;
template<class T>
class stack
{
public:
stack(int size = 10);
virtual ~stack();
void Add(const T& data);
T operator[](int index);
void show(std::ostream &os) const;
private:
int MAX_SIZE;
int len;
T *element;
};
template<class T>
stack<T>::stack(int size)
{
MAX_SIZE = size;
len = 0;
element = new T[size];
}
template<class T>
stack<T>::~stack()
{
delete[]element;
}
template<class T>
T stack<T>::operator[](int index)
{
if (index < 0 || index >= len)
{
abort();
}
return element[index];
}
template<class T>
void stack<T>::Add(const T& data)
{
if (len < MAX_SIZE)
{
element[len] = data;
len++;
}
else
{
T *temp = element;
element = new T[MAX_SIZE+10];
memcpy(element, temp, MAX_SIZE*sizeof(T));
MAX_SIZE = MAX_SIZE + 10;
element[len] = data;
len++;
}
}
template<class T>
std::ostream & operator<<(std::ostream &os,const stack<T>& st)
{
st.show(os);
return os;
}
template<class T>
void stack<T>::show(std::ostream &os) const
{
for (int i = 0; i < len;++i)
{
os << element[i] << " ";
}
}
#endif