un programa de postfijo please

yail
06 de Octubre del 2005
hola spero que me puedas ayudar necesito un programa que evalue una expresion y la pasea postfijo. por tu atencion gracias

kidfun
06 de Octubre del 2005
#include <stdio.h> // programa hecho por FELIPE ROMERO PEDREROS [email protected]
#include <conio.h>
#include <alloc.h> // en dev++ es malloc y alloc es para usar "std"
#include <string.h>
#define TAM 7 //tamaño de arreglo
#define TRUE 1
#define FALSE 0

typedef char TipoP;

typedef struct { // Declaracion de estructura
TipoP info[TAM];
int tope;
}TPila;

TPila *InicPila( ) // iniciacion de la Pila
{ TPila *p = (TPila *) malloc (sizeof(TPila));
p->tope = 0; /*Se tiene una pila vacía*/
return(p);
}

int VaciaPila(TPila *p) // funciones de las pilas
{ if (p->tope == 0) return(TRUE);
else return(FALSE);
}

int LlenaPila(TPila *p)
{ if (p->tope == TAM) return TRUE;
else return FALSE;
}

void AdicPila(TPila *p, TipoP dato)
{ if (LlenaPila(p))
printf("Error, Pila Llenan");
else {
p->info[p->tope] = dato;
p->tope++;
}
}

void ElimPila(TPila *p)
{ if (VaciaPila(p))
printf ("Error, Pila Vacían");
else
p->tope--; /*Elimina el elemento del tope*/
}

TipoP InfoPila(TPila *p)
{ if (VaciaPila(p))
{ printf ("Error, Pila Vacían");
return(0);}
else
return(p->info[p->tope-1]);
}

void DestruirPila(TPila *p)
{ free(p);
}

int verifica(char arreglo[TAM],int i) // funcion para compara caracteres
{ if (arreglo[i]=='/' || arreglo[i]=='*' || arreglo[i]=='+' || arreglo[i]=='-')
return(TRUE);
else
return(FALSE);

}

void posorden(TPila *p,TPila *p2,char arreglo[TAM]) // funcion hace el cambio
{
int i=0,j=0,k;
do{
if(verifica(arreglo,i)==0) // pasa los numeros
{AdicPila(p,arreglo[i]);
i++;
}
if(verifica(arreglo,i)==1) // pasa los caracteres
{
do{
for(k=0;k<j*2+1;k++) // paso caracter 1 a pila 2 y elimino caracter pila 1
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
if(j>=1) // condicion cuando los operadores sean mas de 1 y no se produsca un error de paso parametro y qeden dos operedores juntos
{ if(InfoPila(p)=='-' || InfoPila(p)=='+' || InfoPila(p)=='/' || InfoPila(p)=='*' )
if(InfoPila(p2)=='-' || InfoPila(p2)=='+' || InfoPila(p2)=='/' || InfoPila(p2)=='*')
for(k=0;k<2;k++)
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
else // si no es operador el ultimo de pila1 se pasa
{AdicPila(p2,InfoPila(p));
ElimPila(p);
}
}
AdicPila(p,arreglo[i]); // se agrega a la pila el operador del arreglo
do{ // se pasan todos los datos de pila2 a pila1
AdicPila(p,InfoPila(p2));
ElimPila(p2);
}while(VaciaPila(p2)==0);
i++; j++; // contador para aumentar el arreglo y contador de operadores
}while(verifica(arreglo,i)==1); // continua mientras el areglo sgiente sea operador
j=0;} // se pone en 0 el contador de j porke viene una variable de numero
}while(i<TAM); // termina todo el procedimiento
}

int main()
{ int i;
char arreglo[TAM]={'A','B','/','C','D','*','/'}; //se ingresa los valores
TPila *pp,*pp2; // inicializan las pilas
pp = InicPila();
pp2 = InicPila();
posorden(pp,pp2,arreglo); // funcion hace cambio
for(i=0;i<TAM;i++) // imprime arreglo
printf("%c ",arreglo[i]);
printf("n");
do{ //se da vuelta la pila
AdicPila(pp2,InfoPila(pp));
ElimPila(pp);
}while(VaciaPila(pp)==0);

for(i=0;i<TAM;i++) // imprime la pila
{
printf(" %c",InfoPila(pp2));
ElimPila(pp2);
}
getchar(); // un espacio antes de cerrar
}