convercion de una exprecion infijo a posfijo
hola a todos nesecito hacer un programa que convierta una expresion infijo a una posfijo y no tengo ni idea como hacerlo les agradeceria por su pronta ayuda
gracias..........
gracias..........
//declaracion de las librerias
#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
// declaracion de los argumentos de las librerias
using std::cout;
using std::cin;
using std::endl;
using std::setw;
//declaracion de los nodos que se utlilizaran
struct nodo
{
char dato[20];
struct nodo *siguiente;
struct nodo *atras;
};
struct cola
{
char dato[20];
struct cola *siguiente;
struct cola *atras;
};
struct pila
{
char dato[20];
struct pila *siguiente;
struct pila *atras;
};
// decraracion de la clase
class polaco
{
//parte pribada de la clase
struct nodo *inicio;
struct nodo *fin;
struct cola *raiz;
struct cola *ultimo;
struct pila *cielo;
struct pila *pizo;
// parte publica de la clase
public:
polaco(){raiz = NULL; ultimo = NULL; cielo = NULL; pizo = NULL;inicio = NULL; fin = NULL;}
void llenado(char a[20]);
void mostrar_cola();
void ver_dato();
void cola_salida(char b[20]);
void pila_operadores(char c[20]);
void mostrar_cola_de_saida();
void mostrar_pila_de_operadores();
};
// declaracion de los metodos de la clase
// llenado de la cola de entada *-*-*-*-*- case 1 *-*-*-*-*-*
void polaco::llenado(char a[20])
{
struct nodo *tem;
tem= new (struct nodo);
strcpy((*tem).dato,a);
if(inicio == NULL)
{
inicio = tem;
(*inicio).siguiente = NULL;
(*inicio).atras = NULL;
fin = inicio;
}
else
{
(*tem).siguiente = NULL;
(*fin).siguiente = tem ;
(*tem).atras = fin ;
fin = tem;
}
}
// muestra los elementos de la cola de entrada al usuario
void polaco::mostrar_cola()
{
struct nodo *aux;
if(inicio == NULL)
cout <<"ntt No hay elementos en la cola de entradan";
else
{
aux=inicio;
cout <<"nnnttLos elementos de la cola de entrada son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
//esta es la cola de sailda
void polaco::cola_salida(char b[20])
{
struct cola *aux;
aux= new (struct cola);
strcpy((*aux).dato,b);
if(raiz == NULL)
{
raiz = aux;
(*raiz).siguiente = NULL;
(*raiz).atras = NULL;
ultimo = raiz;
}
else
{
(*aux).siguiente = NULL;
(*ultimo).siguiente = aux ;
(*aux).atras = ultimo ;
ultimo = aux;
}
inicio = (*inicio).siguiente;
(*inicio).atras= NULL;
}
// esta es la pila de operadores
void polaco::pila_operadores(char c[20])
{
struct pila *aux;
aux= new (struct pila);
strcpy((*aux).dato,c);
if(cielo == NULL)
{
cielo = aux;
(*cielo).siguiente = NULL;
(*cielo).atras = NULL;
pizo = cielo;
}
else
{
(*aux).siguiente = NULL;
(*pizo).siguiente = aux ;
(*aux).atras = pizo ;
pizo = aux;
}
/* inicio = (*inicio).siguiente;
(*inicio).atras = NULL;*/
}
// esta funcion muestra el elemento que se encuenta
//en el inicio de el nodo y lo compara com los operadores
//y si es iguia a alguno de ellos los pasa a la pila de operadores
// y sino lo transfiere a la cola de salida
void polaco::ver_dato()
{
struct cola *aux;
struct nodo *tem;
aux = new (struct cola);
tem = new (struct nodo);
tem = inicio;
int a,c,w;
char b[20],d[20];
a=c=w=0;
cout <<"nn";
while(tem!=NULL)
{
a++;
strcpy((*aux).dato,(*tem).dato);
if(strcmp((*aux).dato,"{")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"}")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"[")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"]")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"(")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,")")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"*")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"/")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"+")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"-")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"=")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else
{
strcpy(b,(*aux).dato);
c++;
cola_salida(b);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
cout <<" cola " << c;
}
tem =(*tem).siguiente;
}
}
// imprime la cola de salida
void polaco::mostrar_cola_de_saida()
{
struct cola *aux;
if(raiz == NULL)
cout <<"ntt No hay elementos en la cola de salidan";
else
{
aux = raiz;
cout <<"nnnttLos elementos de la cola de salida son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
//imprime la pila de operadores
void polaco::mostrar_pila_de_operadores()
{
struct pila *aux;
if(cielo == NULL)
cout <<"ntt No hay elementos en la pila de operadoresn";
else
{
aux = cielo;
cout <<"nnnttLos elementos de la pila de operadores son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
void logo()
{
//system("clear");
cout<<"ntttt| \ _ _ / |"<<endl;
cout<<"ntttt( \ / )"<<endl;
cout<<"ntttt = | ="<<endl;
}
char menu()
{
/*//system("clear");
cout<<"ntttt| \ _ _ / |"<<endl;
cout<<"ntttt( \ / )"<<endl;
cout<<"ntttt = | ="<<endl;*/
logo();
char b;
cout<<"nnnttt menu de el programatt"<<endl;
cout<<"nnntt1.- llenado de la cola"<<endl;
cout<<"ntt2.- mostrar la comvercion a polaco"<<endl;
cout<<"ntt3.- evaluacion de la operacion"<<endl;
cout<<"ntt4.- salir de el programa"<<endl;
cout<<"nttFavor de introducir su opcion"<<endl;
cout<<"ntt: ";
cin >> b;
return b;
}
int main()
{
cout <<"nttBienvenidos a la calculadora de numeros polacostt"<<endl;
char c;
polaco z;
do
{
c ='0';
c = menu();
switch(c)
{
case '1':
// system("clear");
logo();
cout <<"nttUsted desidio llenar la cola de entrada"<<endl;
cout <<"nttfavor de incertar un dato seguido de enter"<<endl;
cout <<"nttsi usted no desea incertar mas datos "<<endl;
cout <<"nttpulsar [ # ]"<<endl;
char d[20];
do
{
cout << "nttdame un dato :"; cin >> d;
if(strcmp(d,"#")!= 0)
{
z.llenado(d);
//cout <<"nttel resultado es: "<< d ;
}
if(strcmp(d,"#")== 0)
{
z.mostrar_cola();
}
}while(strcmp(d,"#")!= 0);
break;
case '2':
// system("clear");
logo();
cout <<"nnttUsted desidio ber la convercion polaca"<<endl;
z.mostrar_cola();
z.ver_dato();
z.mostrar_cola_de_saida();
z.mostrar_pila_de_operadores();
break;
case '3':
logo();
break;
case '4':
logo();
break;
default:
//system("clear");
logo();
cout<<"nnttha introducido un caracter no valido";
cout<<"ntt buelva ha intentarlo ;-)";
break;
}
}while(c!='4');
return 0;
}
#include <iostream>
#include <string>
#include <cstdlib>
#include <iomanip>
// declaracion de los argumentos de las librerias
using std::cout;
using std::cin;
using std::endl;
using std::setw;
//declaracion de los nodos que se utlilizaran
struct nodo
{
char dato[20];
struct nodo *siguiente;
struct nodo *atras;
};
struct cola
{
char dato[20];
struct cola *siguiente;
struct cola *atras;
};
struct pila
{
char dato[20];
struct pila *siguiente;
struct pila *atras;
};
// decraracion de la clase
class polaco
{
//parte pribada de la clase
struct nodo *inicio;
struct nodo *fin;
struct cola *raiz;
struct cola *ultimo;
struct pila *cielo;
struct pila *pizo;
// parte publica de la clase
public:
polaco(){raiz = NULL; ultimo = NULL; cielo = NULL; pizo = NULL;inicio = NULL; fin = NULL;}
void llenado(char a[20]);
void mostrar_cola();
void ver_dato();
void cola_salida(char b[20]);
void pila_operadores(char c[20]);
void mostrar_cola_de_saida();
void mostrar_pila_de_operadores();
};
// declaracion de los metodos de la clase
// llenado de la cola de entada *-*-*-*-*- case 1 *-*-*-*-*-*
void polaco::llenado(char a[20])
{
struct nodo *tem;
tem= new (struct nodo);
strcpy((*tem).dato,a);
if(inicio == NULL)
{
inicio = tem;
(*inicio).siguiente = NULL;
(*inicio).atras = NULL;
fin = inicio;
}
else
{
(*tem).siguiente = NULL;
(*fin).siguiente = tem ;
(*tem).atras = fin ;
fin = tem;
}
}
// muestra los elementos de la cola de entrada al usuario
void polaco::mostrar_cola()
{
struct nodo *aux;
if(inicio == NULL)
cout <<"ntt No hay elementos en la cola de entradan";
else
{
aux=inicio;
cout <<"nnnttLos elementos de la cola de entrada son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
//esta es la cola de sailda
void polaco::cola_salida(char b[20])
{
struct cola *aux;
aux= new (struct cola);
strcpy((*aux).dato,b);
if(raiz == NULL)
{
raiz = aux;
(*raiz).siguiente = NULL;
(*raiz).atras = NULL;
ultimo = raiz;
}
else
{
(*aux).siguiente = NULL;
(*ultimo).siguiente = aux ;
(*aux).atras = ultimo ;
ultimo = aux;
}
inicio = (*inicio).siguiente;
(*inicio).atras= NULL;
}
// esta es la pila de operadores
void polaco::pila_operadores(char c[20])
{
struct pila *aux;
aux= new (struct pila);
strcpy((*aux).dato,c);
if(cielo == NULL)
{
cielo = aux;
(*cielo).siguiente = NULL;
(*cielo).atras = NULL;
pizo = cielo;
}
else
{
(*aux).siguiente = NULL;
(*pizo).siguiente = aux ;
(*aux).atras = pizo ;
pizo = aux;
}
/* inicio = (*inicio).siguiente;
(*inicio).atras = NULL;*/
}
// esta funcion muestra el elemento que se encuenta
//en el inicio de el nodo y lo compara com los operadores
//y si es iguia a alguno de ellos los pasa a la pila de operadores
// y sino lo transfiere a la cola de salida
void polaco::ver_dato()
{
struct cola *aux;
struct nodo *tem;
aux = new (struct cola);
tem = new (struct nodo);
tem = inicio;
int a,c,w;
char b[20],d[20];
a=c=w=0;
cout <<"nn";
while(tem!=NULL)
{
a++;
strcpy((*aux).dato,(*tem).dato);
if(strcmp((*aux).dato,"{")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"}")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"[")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"]")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"(")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,")")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"*")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"/")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"+")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"-")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else if(strcmp((*aux).dato,"=")==0)
{
strcpy(d,(*aux).dato);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
w++;
cout <<" pila " << w;
pila_operadores(d);
}
else
{
strcpy(b,(*aux).dato);
c++;
cola_salida(b);
cout <<"nttel dato ["<<a<<"] es: ";cout <<" | "; cout <<(*aux).dato;cout <<" |";
cout <<" cola " << c;
}
tem =(*tem).siguiente;
}
}
// imprime la cola de salida
void polaco::mostrar_cola_de_saida()
{
struct cola *aux;
if(raiz == NULL)
cout <<"ntt No hay elementos en la cola de salidan";
else
{
aux = raiz;
cout <<"nnnttLos elementos de la cola de salida son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
//imprime la pila de operadores
void polaco::mostrar_pila_de_operadores()
{
struct pila *aux;
if(cielo == NULL)
cout <<"ntt No hay elementos en la pila de operadoresn";
else
{
aux = cielo;
cout <<"nnnttLos elementos de la pila de operadores son nnntt:";
cout <<"| ";
while(aux!=NULL)
{
cout <<(*aux).dato;
cout <<" ";
aux =(*aux).siguiente;
}
cout <<" |";
}
}
void logo()
{
//system("clear");
cout<<"ntttt| \ _ _ / |"<<endl;
cout<<"ntttt( \ / )"<<endl;
cout<<"ntttt = | ="<<endl;
}
char menu()
{
/*//system("clear");
cout<<"ntttt| \ _ _ / |"<<endl;
cout<<"ntttt( \ / )"<<endl;
cout<<"ntttt = | ="<<endl;*/
logo();
char b;
cout<<"nnnttt menu de el programatt"<<endl;
cout<<"nnntt1.- llenado de la cola"<<endl;
cout<<"ntt2.- mostrar la comvercion a polaco"<<endl;
cout<<"ntt3.- evaluacion de la operacion"<<endl;
cout<<"ntt4.- salir de el programa"<<endl;
cout<<"nttFavor de introducir su opcion"<<endl;
cout<<"ntt: ";
cin >> b;
return b;
}
int main()
{
cout <<"nttBienvenidos a la calculadora de numeros polacostt"<<endl;
char c;
polaco z;
do
{
c ='0';
c = menu();
switch(c)
{
case '1':
// system("clear");
logo();
cout <<"nttUsted desidio llenar la cola de entrada"<<endl;
cout <<"nttfavor de incertar un dato seguido de enter"<<endl;
cout <<"nttsi usted no desea incertar mas datos "<<endl;
cout <<"nttpulsar [ # ]"<<endl;
char d[20];
do
{
cout << "nttdame un dato :"; cin >> d;
if(strcmp(d,"#")!= 0)
{
z.llenado(d);
//cout <<"nttel resultado es: "<< d ;
}
if(strcmp(d,"#")== 0)
{
z.mostrar_cola();
}
}while(strcmp(d,"#")!= 0);
break;
case '2':
// system("clear");
logo();
cout <<"nnttUsted desidio ber la convercion polaca"<<endl;
z.mostrar_cola();
z.ver_dato();
z.mostrar_cola_de_saida();
z.mostrar_pila_de_operadores();
break;
case '3':
logo();
break;
case '4':
logo();
break;
default:
//system("clear");
logo();
cout<<"nnttha introducido un caracter no valido";
cout<<"ntt buelva ha intentarlo ;-)";
break;
}
}while(c!='4');
return 0;
}
