Título: Proyecto Analizador de Parentesis implementado con Puntero de Clase Pila
Publicado por: Elias Flores en 8 Julio 2019, 18:02 pm
#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; }
Título: Re: Proyecto Analizador de Parentesis implementado con Puntero de Clase Pila
Publicado por: K-YreX en 10 Julio 2019, 21:48 pm
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
Título: Re: Proyecto Analizador de Parentesis implementado con Puntero de Clase Pila
Publicado por: Elias Flores en 14 Julio 2019, 00:48 am
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
|