#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
typedef enum {False,True} Booleano;
typedef enum {izq, igual, der, none} Par;
char Simbolos[4][3]={{'(',')','\0'},{'-','+','\0'},{'/','*','\0'},{'^','\0','\0'}};
void Limpiar(char[], int);
void Insertar(char[], char []);
void Agregar(char[], char);
void Leer(char[]);
void Rec_Exp_Pos(char[]);
void Conv_Pos(char[], char []);
int Prioridad(char, char);
int Longitud(char []);
Par VerificarLaCadena(char []);
Booleano VerificarSimbolo(char);
int main(int argc, char *argv[])
{
char Exp[50], E1[50], EPOS[50];
Limpiar(EPOS, 50);
Limpiar(E1, 50);
do
{
system("CLS");
printf("\n \n \n");
printf("%s","\t \t \t UNIVERSIDAD MARIANO GALVEZ \n \n");
printf("%s","\t \t Proyecto Final Estructura De Datos \n");
printf("%s","\t \t Carlos Rolando Calan Ajquill Junio/2006 \n");
printf("%s","\t \t Carne: 0910-04-13429 5to. Semestre \n");
printf("%s","\t \t ----------------------------------------------\n");
printf("%s","\t \t Ejercicio del Manejo de Pila(Expresion Infija)\n ");
printf("%s","\t \t ----------------------------------------------\n\n");
printf("%s","Introduzca la expresion infija: \n");
Leer(Exp);
if(VerificarLaCadena(Exp) != igual)
{
printf("La expresion \'%s\' no es valida", Exp);
switch (VerificarLaCadena(Exp))
{
case izq: printf("Le faltan parentesis derechos.");break;
case der: printf("Le faltan parentesis izquierdos.");break;
case none:
printf("Ya que no es funcion valida.");break;
}
}
} while (VerificarLaCadena(Exp) != igual);
Insertar(E1,Exp);
Conv_Pos(E1,EPOS);
printf("%s %s\n","Su conversion a Postfija es: ",EPOS);
getch();
system("PAUSE");
}
void Limpiar(char Text[], int n)
{
int i;
for(i=0; i<n; i++)
Text[i] = '\0';
}
void Leer(char Exp[])
{
int i;
for(i=0; (Exp[i] = getchar()) != '\n'; ++i);
Exp[i] = '\0';
}
int Prioridad(char exp1, char exp2)
{
int i,j,p1,p2;
for(i=0; i<4; i++)
for(j=0; j<3; j++)
{
if(exp1==Simbolos[i][j])
p1=i;
if(exp2==Simbolos[i][j])
p2=i;
}
if(p1 < p2)
i=-1;
else
if(p1 == p2)
i=0;
else
if(p1 > p2)
i=1;
return(i);
}
int Longitud(char text[])
{
int n;
for(n=0; text[n] != '\0' ; ++n);
return(n);
}
void Insertar(char A[],char B[])
{
int n1, n2, i;
n1 = Longitud(A);
n2 = Longitud(B);
for(i=n1; i<(n1+n2); i++)
A[i]= B[i-n1];
A[i]= '\0';
}
Par VerificarLaCadena(char text[])
{
int i, n, cont1, cont2, TOPE;
char PILA[50], elem;
Par val = none;
n = Longitud(text);
if (n > 0)
{
TOPE = 0;
cont1 = cont2 =0;
for(i=0; i<n; i++)
{
elem = text[i];
if (elem == '(')
{
PILA[TOPE] = elem;
TOPE++;
PILA[TOPE] = '\0';
}
else
if (elem == ')')
if (TOPE > 0)
{
if (PILA[TOPE-1] == '(')
{
TOPE--;
PILA[TOPE]='\0';
}
}
else
{
PILA[TOPE] = elem;
TOPE++;
PILA[TOPE] = '\0';
}
}
if (TOPE > 0)
{
for(i=0; i<TOPE; i++)
{
if (PILA[i] == '(')
cont1++;
if (PILA[i] == ')')
cont2++;
}
if (cont1 < cont2)
val = der;
if (cont1 > cont2)
val = izq;
}
else
val = igual;
}
else
val = none;
return(val);
}
Booleano VerificarSimbolo(char Expr)
{
int i, j;
Booleano val;
val = False;
for(i=0; i<4; i++)
for(j=0; j<3; j++)
if(Expr == Simbolos[i][j])
val=True;
return(val);
}
void Agregar(char Exp1[], char Exp2)
{
int n;
n = Longitud(Exp1);
Exp1[n] = Exp2;
}
void Rec_Exp_Pos(char Text[])
{
int i,n;
n = Longitud(Text);
for(i=0; i<(n-1); i++)
Text[i]= Text[i+1];
Text[i] = '\0';
}
void Conv_Pos(char EI[],char EPOS[])
{
int TOPE, n;
char Simbolo, PILA[50];
Limpiar(PILA, 50);
TOPE=-1;
n = Longitud(EI);
while(EI[0]!='\0')
{
Simbolo=EI[0];
Rec_Exp_Pos(EI);
n-=1;
if (Simbolo=='(')
{
TOPE+=1;
PILA[TOPE]=Simbolo;
}
else
if(Simbolo==')')
{
while(PILA[TOPE]!='(')
{
Agregar(EPOS,PILA[TOPE]);
PILA[TOPE]='\0';
TOPE-=1;
}
PILA[TOPE]='\0';
TOPE-=1;
}
else
if(VerificarSimbolo(Simbolo)==False)
{
Agregar(EPOS,Simbolo);
}
else
{
if(Longitud(PILA)>0)
{
while(Prioridad(Simbolo, PILA[TOPE]) <= 0)
{
Agregar(EPOS, PILA[TOPE]);
PILA[TOPE] = '\0';
TOPE-=1;
if(TOPE < 0)
break;
}
}
TOPE+=1;
PILA[TOPE]=Simbolo;
}
}
while(TOPE>=0)
{
Agregar(EPOS,PILA[TOPE]);
TOPE-=1;
}
}
