Proyecto Analizador de Parentesis implementado con Puntero de Clase Pila

Iniciado por Elias Flores, 8 Julio 2019, 18:02 PM

0 Miembros y 1 Visitante están viendo este tema.

Elias Flores

Código (cpp) [Seleccionar]

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct Nodo{
int Elemento;
Nodo *Sig;
};
class Pila{
private:
Nodo *Tope;
public:
void Crear();
bool Vacia();
void Meter(int);
void Sacar(int &);
//int Cima();
void Mostrar();
void Analizar();
};
void Pila::Crear(){
  Tope=NULL;
}
bool Pila::Vacia(){
 return Tope==NULL;
}
//int Pila::Cima(){
 //if(!Vacia()){
 //return Tope->Elemento;
 //}
//}
void Pila::Meter(int E){
 Nodo *aux=new Nodo();
 if(aux!=NULL){
aux->Elemento=E;
aux->Sig=Tope;
Tope=aux;
 }
}
void Pila::Sacar(int &E){
 if(!Vacia()){
Nodo *aux=Tope;
E=Tope->Elemento;
Tope=Tope->Sig;
delete(aux);
 }
}
void Pila::Analizar(){
   Pila p;
char frase [30];
int x,c,d;
p.Crear();
c=0;
d=0;
cout<<"Escriba un texto: "<<endl;
cin>>frase;
int i=0;
while(frase[i]!='\0'){
  if(frase[i]=='('){
  p.Meter(frase[i]);
  c++;
  }
  if(frase[i]==')'){
  p.Sacar(x);
  d++;
  }
  i++;
}
if(c==d)
cout<<"Los parentesis estan correctos"<<endl;
else
cout<<"Los parentesis estan incorrectos"<<endl;
}
void Pila::Mostrar(){
Nodo *aux=Tope;
if (!Vacia()) {
  while (aux!=NULL){
cout<<"||\t";
cout<<aux->Elemento;
cout<<"\t ||\n";
aux=aux->Sig;
}
}else{
cout<<" ||\t \t||\n";
}
}
int main(){
bool menu=true;int i;Pila P;
   while(menu){
cout<<"\t\t*********************************"<<endl;
cout<<"\t\t*\tMENU\t\t\t*"<<endl;
cout<<"\t\t*********************************"<<endl;
cout<<"\t\t*\t1.-Analizar Frase: \t*"<<endl;
cout<<"\t\t*\t2.-Mostrar Pila\t\t*"<<endl;
cout<<"\t\t*\t3.-Salir\t\t*"<<endl;
cout<<"\t\t*********************************"<<endl;
cin>>i;
       if(i==1){
           P.Analizar();
       }else{
           if(i==2){
               P.Mostrar();
           }else{
               if(i==3){
                   exit(0);
               }
           }
       }
}
   return 0;
}

K-YreX

Algunas funciones son mejorables...
  • La función <Crear()> se podría implementar como el constructor por defecto para no tener que llamarlo cuando creas una <Pila>.
  • La función <Sacar()> podría devolver el valor en vez de meterlo en una variable por referencia (como el clásico <top()> de la <stack> de STL aunque en este caso <Sacar()> hace el trabajo de <top()> y <pop()> juntos).
  • La función <Analizar()> debería ser de tipo <bool> para evitar un <cout> dentro de la función.
  • Si usas un <string> en lugar de un <char[]> no tendrás el problema de sobrepasar los 30 caracteres (ventajas de C++).
  • El menu podrías poner <while(true)> y evitar una variable más o hacer un <do while> para salir cuando la opción sea 3 y evitar el uso de <exit()>

    Estos son únicamente consejos por si quieres mejorar la implementación. Y ya para hacerlo más completo te recomendaría usar un <template> para poder usarla con distintos tipos de datos. Suerte si te animas a implementar alguna de las ideas. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Elias Flores

El codigo en si puede ser mucho mas corto con recurison y añadiendo los consejos que me diste pero el docente con el que estoy me pide hacerlo de esta forma para aprender a estructurar codigos ya que la materia en la que estoy se llama ESTRUCTURA DE DATOS 1 lo subi por si alguien necesita una orientacion en este tema de la carrera de programacion yo mismo lo arreglaria el codigo pero estoy en examenes FINALES T_T pero si gusta modificarlo hazlo 8D solo recuerda compartir al final tu codigo MODIFICADO para ayudar a la comunidad y recuerda EL QUE NO COMPARTE NO ENTRA AL CIELO  ;-) :D :D ;D