// Pilha.h
// Declaração das classes :
//		 cElemLista  ( representa um elemento da lista )
//		 cPilha      ( representa uma Pilha )

// Aula do dia 6 de Dezembro de 2001


template<class T> 
class cPilha
{
	class cElemLista     // Classe privada de cPilha
	{
	public :
		T Dados;
		cElemLista *Proximo;
	
		cElemLista() { Proximo = 0;};
	};

	
	cElemLista *Head;			// ponteiro para o primeiro elemento 
	
public :
	cPilha();
	~cPilha();   // destrutor
	
	bool Inserir( T Obj  );     // Insere no início
	bool Remover( T &Obj );	  // Remove no início	

};

//template<class T>
//cPilha<T>::cElemLista::cElemLista( )
//{
//	Proximo = 0;
//}


// IMPLEMENTAÇÃO dos métodos da classe cPilha
template<class T>
cPilha<T>::cPilha()
{
	Head = 0;
}
template<class T>
cPilha<T>::~cPilha()
{
	cElemLista *p, *pNext;

	for ( p=Head; p ;  )
	{
		pNext = p->Proximo;
		delete p;
		p = pNext;
	}
}


// Inserção no início
template<class T>
bool cPilha<T>::Inserir( T Obj )
{
	cElemLista *pNovo;
	
	pNovo = new cElemLista();

	pNovo->Dados = Obj;
	pNovo->Proximo = Head;

	Head = pNovo;

	return true;
}

// Remoção no início
template<class T>
bool cPilha<T>::Remover( T &Obj )
{
	cElemLista *pRemover;

	if ( Head == 0 ) return false;
	
	pRemover = Head;

	Head = Head->Proximo ;

	Obj = pRemover->Dados ;

	delete pRemover;

	return true;
}


