Jump to content
Sign in to follow this  
saramgsilva

[C++] Classes Pilhas e Filas

Recommended Posts

saramgsilva

Vou apresentar outro exemplo de classes... desta vez , tem a ver com pilhas e filas e inclui tratamento de erros.

Nota: para os que tentarem usar estes ficheiros, não se esqueçam que precisam da classe Par e Ponto, que também disponibilizo...

(tópico sobre a classe Par e Ponto aqui ...)

Exemplo de fila retirado por estar errado...Peço desculpa 😳

Agora um exemplo de pilhas genérica, em que podemos usar qualquer tipo de dados!! :P

PilhaGenerica.cpp:

#include <iostream>

using namespace std;

//------------------- ERRO ------------------------------

class Erro_na_pilha
{
public:
 Erro_na_pilha(){};
 virtual void print_erro() const {cerr<<"Erro na Pilha!"<<endl;}
};


class Cheia:public Erro_na_pilha
{
public:
 Cheia(){};
 virtual void print_erro() const {cerr<<"A pilha esta cheia."<<endl;}
};


class Vazia:public Erro_na_pilha{
public:
 Vazia(){};
 virtual void print_erro()const {cerr<<"A pilha esta vazia."<<endl;};
};


// --------------- PILHA --------------------------

template <class C, const int maximo>

class Pilha
{
private:
 struct no_pilha
 {
C* elem;
no_pilha* ponta;
 };
 int n_elem;
 no_pilha* topo;
public:

 Pilha(){topo=NULL;n_elem=0;}

 virtual int get_maximo(){return maximo;}

 virtual int get_n_elem(){return n_elem;}


 virtual void push(C &i)
 {
  if (n_elem<maximo)
  {
   no_pilha* novo=new no_pilha;
   novo->elem=&i;
   novo->ponta=topo;
   topo=novo;
   n_elem++;
  }
else
  throw Cheia();

 }


 virtual C* pop()
 { if (topo!=NULL)
  {
no_pilha* aux=new no_pilha;
aux=topo;
topo=topo->ponta;
C* removido=(aux->elem);
delete aux;
n_elem--;
return removido;
  }
else
  throw Vazia();
 }


 virtual void printpilha()
 {
if (topo!=NULL)
{
   no_pilha* aux= new no_pilha;
   aux=topo;
   int contador=n_elem;
   cout <<endl<<"________Os elementos da Pilha :_______ "<<endl<<endl;
   while (aux!=NULL)
   {
	 cout<<contador<<") ";
	 contador--;
	 aux->elem->print();
	 aux=(aux->ponta);
	 cout<<endl;
   }
  cout<<endl;
 }

else
  throw Vazia();
 }

 virtual void elimina_na_base()
 {
Pilha <C, maximo> copiapilha;
while (n_elem>0)
{
	copiapilha.push(*pop());
}

copiapilha.pop();

while (copiapilha.get_n_elem()>0)
{
   push(*copiapilha.pop());
}
 }
};


 

UsarPilhaGenerica.cpp:

#include <iostream>
#include "Ponto.cpp"
#include "PilhaGenerica.cpp"
using namespace std;

int main()
{
 Pilha<Par,10> pilhaA;
 int opcao=1;
 cout<<endl;
 cout<<endl;
 while (opcao!=0)
{ cout<<"\t################################"<<endl;
  cout<<"\t# Escolha a opção:			 #"<<endl;
  cout<<"\t# 1) Adicionar Par na pilha.   #"<<endl;
  cout<<"\t# 2) Adicionar Ponto na pilha. #"<<endl;
  cout<<"\t# 3) Remover elemento do topo. #"<<endl;
  cout<<"\t# 4) Listar elementos da pilha.#"<<endl;
  cout<<"\t# 0) Sair.					 #"<<endl;				  
  cout<<"\t################################"<<endl;
  cout<<endl;
  cout<<endl;
  cin>>opcao;
  switch (opcao)
{
case 0:
  { cout<<"Adeus..."<<endl<<endl;
	break;
  }
case 1:
  {
	cout<<"Coordenadas do tipo Par:"<<endl<<"->";
	double a;
	double b;
	cin>> a;
	cout<<"=>";
	cin>> b;

	Par*Pr= new Par;
	(*Pr).set_left(a);
	(*Pr).set_right(b);

	try {pilhaA.push(*Pr);}

	catch (Erro_na_pilha &E)
	{
		E.print_erro();
		 pilhaA.elimina_na_base();
		pilhaA.push(*Pr);
	}

	break;
  }
case 2:
  {
	cout<<"Coordenadas do tipo Ponto:"<<endl<<"->";
	double x;
	double y;
	cin>> x;
	cout<<"=>";
	cin>> y;

	Ponto*Pt=new Ponto;
	(*Pt).set_left(x);
	(*Pt).set_right(y);

	try {pilhaA.push(*Pt);}

	catch (Erro_na_pilha &E)
	{
	   E.print_erro();
	   pilhaA.elimina_na_base();
	   pilhaA.push(*Pt);
	}

	break;
  }
case 3:
  {
	try{cout<<"Elemento ";pilhaA.pop()->print();cout<<" removido.\n\n";}
	catch (Erro_na_pilha &E){E.print_erro();}
	break;
  }
case 4:
  {
	try{pilhaA.printpilha();}
	catch (Erro_na_pilha &E){E.print_erro();}
	break;
  }
default:{cout<<"Opcao invalida!!!"<<endl<<endl;}
}
}	
};
 

o próximo exemplo é praticamente igual aos anteriores,o que distingue é o facto de não fazer o tratamento de erro... agora podem ver as diferenças... na execução...

outra diferença esta que agora vou usar vectores e no anterior usei memória dinâmica ...

Pilhas.cpp:

#include <iostream>
#include "Ponto.cpp"

using namespace std;

template <class C, const int maximo>


class Pilha
{
private:
 struct no_pilha
 {
C* elem;
no_pilha* ponta;
 };
 int n_elem;
 no_pilha* topo;
public:
 Pilha(){topo=NULL;n_elem=0;}

 virtual int get_maximo()const{return maximo;}


 virtual int get_n_elem()const{return n_elem;}

 virtual void push(C &i)
 {
if (n_elem<maximo)
  {
no_pilha* novo=new no_pilha;
novo->elem=&i;
novo->ponta=topo;
topo=novo;
n_elem++;
  }
 }

 virtual C* pop()
 {
if (topo!=NULL)
  {
no_pilha* aux=new no_pilha;
aux=topo;
topo=topo->ponta;
C* removido=(aux->elem);
delete aux;
n_elem--;
return removido;
  }
 }

 virtual void printpilha()const
 {
if (topo!=NULL)
{
   no_pilha* aux= new no_pilha;
   aux=topo;
   int contador=n_elem;
   cout <<endl<<"________Os elementos da Pilha :_______ "<<endl<<endl;
   while (aux!=NULL)
   {
	 cout<<contador<<") ";
	 contador--;
	 aux->elem->print();
	 aux=(aux->ponta);
	 cout<<"\n";
   }
  cout<<"\n";
}
else
  cout<<"________A pilha esta vazia.________ "<<endl<<endl;
 }

};


int main()
{
 Pilha<Par,10> pilhaA;
 int opcao=1;
 cout<<endl;
 cout<<endl;
 Par Pr[10];
 Ponto Pt[10];
 while (opcao!=0)
{ cout<<"\t################################"<<endl;
  cout<<"\t# Escolha a opção:			 #"<<endl;
  cout<<"\t# 1) Adicionar Par da pilha.	#"<<endl;
  cout<<"\t# 2) Adicionar Ponto da pilha.  #"<<endl;
  cout<<"\t# 3) Remover elemento do topo. #"<<endl;
  cout<<"\t# 4) Listar elementos da pilha.#"<<endl;
  cout<<"\t# 0) Sair.					 #"<<endl;				  
  cout<<"\t################################"<<endl;
  cout<<endl;
  cout<<endl;
  cin>>opcao;
  switch (opcao)
{
case 0:
  { cout<<"Adeus..."<<endl<<endl;
	break;
  }
case 1:
  {
	if (pilhaA.get_n_elem()<pilhaA.get_maximo())
	  {
	cout<<"Coordenadas do tipo Par:"<<endl<<"->";
	double a;
	double b;
	cin>> a;
	cout<<"->";
	cin>> b;
	Pr[(pilhaA.get_n_elem())].set_left(a);
	Pr[(pilhaA.get_n_elem())].set_right(b);
	pilhaA.push(Pr[(pilhaA.get_n_elem())]);
	  }
	else
	  cout<<"______A pilha cheia.________"<<endl<<endl;
	break;
  }
case 2:
  {
	if (pilhaA.get_n_elem()<pilhaA.get_maximo())
	  {
	cout<<"Coordenadas do tipo Ponto:"<<endl<<"->";
	double x;
	double y;
	cin>> x;
	cout<<"=>";
	cin>> y;
	Pt[(pilhaA.get_n_elem())].set_left(x);
	Pt[(pilhaA.get_n_elem())].set_right(y);
	pilhaA.push(Pt[(pilhaA.get_n_elem())]);
	  }
	else
	  cout<<"_____________A pilha esta cheia.___________"<<endl<<endl;
	break;
  }
case 3:
  {
	if (pilhaA.get_n_elem()>0)
	  {
	cout<<"O elemento da pilha :";pilhaA.pop()->print();cout<<" foi removido da pilha."<<endl<<endl;
	  }
	else
	  cout<<"_________________A pilha esta vazia.__________"<<endl<<endl;
	break;
  }
case 4:
  {
	pilhaA.printpilha();
	break;
  }
default:{cout<<"Opcao invalida!!!"<<endl<<endl;}
}
}

};
 

qualquer dúvida ou se encontrarem alguma gafe...avisem ;)

  • Vote 1

Share this post


Link to post
Share on other sites
pedrotuga

ehehehehe....

eu conheço isso das aulas de EDA :D

Tofas boa onda afixares isso aqui.

Mas já que cá estamos... olha que os teus profs dão isso pelo interesse didatico que isso tem, mas não te dizem que há uma coisa chamada STL.

usa o google para "STL"

Share this post


Link to post
Share on other sites
saramgsilva

ehehehehe....

eu conheço isso das aulas de EDA :D

Tofas boa onda afixares isso aqui.

Mas já que cá estamos... olha que os teus profs dão isso pelo interesse didatico que isso tem, mas não te dizem que há uma coisa chamada STL.

usa o google para "STL"

oh mal falei em  templates... o unico exemplo que fiz foi mesmo esta da pilha...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.