//##############################################################################
//Encabezados necesarios para el programa:
#include <stdio.h>
#include <stdlib.h>
#include <E:\C\encabezados\estructuras.h>
//##############################################################################
//Este programa recibe una expresion "infijo" y la devuelve en formato
//"postfijo"
//##############################################################################
//#############################PROTOTIPOS#######################################
int tam_infijo (char * array);
char * scan_infijo ();
int esOperador (char c);
int esParentesis (char c);
int precedencia (char operador1, char operador2);
void inFijo2postFijo (char inFijo[], char postFijo[]);
//##############################################################################
//##############################FUNCIONES#######################################
int tam_infijo (char * array){
int cont = 0;
while ( *( array + cont ) != '\0' ){
cont++;
}
return cont - 1;
}
char * scan_infijo (){
char * expresion;
expresion
= (char*) calloc (200, sizeof (char));
expresion
= (char*) realloc (expresion
, sizeof(char) *
( tam_infijo (expresion) + 1) );
}
int esOperador (char c){
return c == '+' || c == '-' || c == '*' || c == '/';
}
int esParentesis (char c){
if ( c == '(' ){
return 1;
}
else if ( c == ')' ){
return -1;
}
else return 0;
}
int precedencia (char operador1, char operador2){
if ( ( operador1 == '*' || operador1 == '/' ) && ( operador2 == '+'
|| operador2 == '-' ) ) return 1; //Precedencia del operador 1 mayor
else if ( ( operador1 == '+' || operador1 == '-' ) && ( operador2 == '*'
|| operador2 == '/' ) ) return 0; //Precedencia del operador 1 menor
else return -1; //Precedencia del operador 1 igual que la del operador 2
}
void inFijo2postFijo (char inFijo[], char postFijo[]){
ptrNuevaPila pila = NULL;
int i = 0, j = 0;
empujar_pila ( &pila, '(' );
inFijo = (char*)
realloc (inFijo
, ( ( ( tam_infijo
(inFijo
) ) + 2 ) * sizeof (char) ) );
inFijo [tam_infijo (inFijo)] = ')';
inFijo [tam_infijo (inFijo) + 1] = '\0';
while ( pila != NULL ){
if ( esOperador ( inFijo [i] ) ){
while ( ( esOperador ( pila->dato ) ) && (
precedencia (inFijo [i], pila->dato ) == 0 ||
precedencia (inFijo [i], pila->dato ) == -1 ) ) {
postFijo [j] = pila->dato;
j++;
sacar_pila( &pila );
}
empujar_pila ( &pila, inFijo [i] );
}
else if ( esParentesis ( inFijo [i] ) ){
if ( esParentesis ( inFijo [i] ) == 1 ){
empujar_pila ( &pila, inFijo [i] );
}
else{
while ( pila->dato != '(' && esOperador ( pila->dato ) ){
postFijo [j] = pila->dato;
j++;
sacar_pila ( &pila );
}
sacar_pila ( &pila );
}
}
else{
postFijo [j] = inFijo [i];
j++;
}
i++;
}
postFijo [j] == '\0';
}
//##############################################################################
//##############################MAIN############################################
int main (){
char * infijo = scan_infijo ();
char postFijo [tam_infijo(infijo)+1];
inFijo2postFijo(infijo, postFijo);
return 0;
}
//##############################################################################