#include <iostream>
using namespace std;

template <class x> class Stack {
public:
	Stack	(int m);
	~Stack	();
	int		StackIsFull();
	int		StackIsEmpty();
	void	Push(x e);
	void	Pop(x& e);
	void	PrintStack();
private:
	int		maxsize;
	int		top;
	x		*p;
};

int main(){

	Stack<int> s1(10);
	s1.Push(2);
	s1.Push(4);
	s1.Push(6);
	
	s1.PrintStack();
	return 0;
}

template <class x> Stack<x>::Stack(int m){
	maxsize = m;
	top = -1;
	p = new x[maxsize];
}

template <class x> Stack<x>::~Stack(){
	delete [] p;
}

template <class x> int Stack<x>::StackIsFull(){
	if (top == maxsize - 1)
			return 1;
	return 0;
}

template <class x> int Stack<x>::StackIsEmpty(){
	if (top == -1)
			return 1;
	return 0;
}

template <class x> void Stack<x>::Push(x e){
	if (!StackIsFull()){
		top++;
		p[top] = e;
	}
}

template <class x> void Stack<x>::Pop(x &e){
	if (!StackIsEmpty()){
		e = p[top];
		top--;
	}
}

template <class x> void Stack<x>::PrintStack(){
	x e;
	if (!StackIsEmpty()){
		Pop(e);
		PrintStack();
		cout << e << endl;
		Push(e);
	}
}