/*
 * Instituto Superior de Engenharia do Porto
 *
 * Estruturas de Informação
 *
 * 2000/2001
 *
 * ------------------------------------------
 *
 * Classe de Lista de Inteiros (LIFO)
 *
 * listaint.h
 *
 */

#ifndef __LISTA_INT_INC__
#define __LISTA_INT_INC__


#ifndef NULL
#define NULL 0
#endif

class ListaInteiros
{
private:

protected:
	struct NoInteiro
	{
		int m_nConteudo;
		NoInteiro* m_pProx;


		NoInteiro(int iValor, NoInteiro* pProx = NULL)
		{
			m_nConteudo = iValor; 
			m_pProx = pProx; 
		}
	};

	NoInteiro* m_pInicio;
	int m_nCount;

	static void copia(ListaInteiros& l, const NoInteiro* p);

public:
	ListaInteiros();
	ListaInteiros(const ListaInteiros& o);
	~ListaInteiros();

	bool inserir(int iValor);
	int retirar();
	int topo() const		{ return m_pInicio->m_nConteudo; }
	int comprimento() const	{ return m_nCount; }
	bool vazia() const		{ return (m_pInicio == NULL); }
	void removerTodos();

	ListaInteiros& operator=(const ListaInteiros& o);

	friend bool operator==(const ListaInteiros& a, const ListaInteiros& b);
	friend ListaInteiros operator+(const ListaInteiros& a, const ListaInteiros& b);
	friend ostream& operator<<(ostream& output, const ListaInteiros& obj);
};

bool operator==(const ListaInteiros& a, const ListaInteiros& b);
ListaInteiros operator+(const ListaInteiros& a, const ListaInteiros& b);
ostream& operator<<(ostream& output, const ListaInteiros& obj);

#endif
