#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;
}
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
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