• Jueves 14 de Noviembre de 2024, 23:33

Autor Tema:  Infijo a postfijo  (Leído 2601 veces)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Infijo a postfijo
« en: Lunes 25 de Julio de 2011, 16:39 »
0
Hola, estoy haciendo un programa que me convierta una expresion infijo a postfijo. El programa funcionar funciona, pero añade caracteres extraños al final de la cadena a veces o imprime un intro o cosas asi.

Código: C
  1. //##############################################################################
  2.  
  3. //Encabezados necesarios para el programa:
  4.  
  5. #include <stdio.h>
  6.  
  7. #include <stdlib.h>
  8.  
  9. #include <E:\C\encabezados\estructuras.h>
  10.  
  11. //##############################################################################
  12.  
  13. //Este programa recibe una expresion "infijo" y la devuelve en formato
  14. //"postfijo"
  15.  
  16. //##############################################################################
  17.  
  18. //#############################PROTOTIPOS#######################################
  19.  
  20. int tam_infijo (char * array);
  21.  
  22. char * scan_infijo ();
  23.  
  24. int esOperador (char c);
  25.  
  26. int esParentesis (char c);
  27.  
  28. int precedencia (char operador1, char operador2);
  29.  
  30. void inFijo2postFijo (char inFijo[], char postFijo[]);
  31.  
  32. //##############################################################################
  33.  
  34. //##############################FUNCIONES#######################################
  35.  
  36. int tam_infijo (char * array){
  37.    
  38.     int cont = 0;
  39.    
  40.     while ( *( array + cont ) != '\0' ){
  41.          
  42.           cont++;
  43.          
  44.     }
  45.    
  46.     return cont - 1;
  47.    
  48. }
  49.  
  50. char * scan_infijo (){
  51.    
  52.     char * expresion;
  53.    
  54.     expresion = (char*) calloc (200, sizeof (char));
  55.    
  56.     scanf("%s", expresion);
  57.    
  58.     getchar();
  59.    
  60.     expresion = (char*) realloc (expresion, sizeof(char) *
  61.    
  62.     ( tam_infijo (expresion) + 1) );
  63.    
  64. }
  65.  
  66. int esOperador (char c){
  67.    
  68.     return c == '+' || c == '-' || c == '*' || c == '/';
  69.    
  70. }
  71.  
  72. int esParentesis (char c){
  73.    
  74.     if ( c == '(' ){
  75.          
  76.          return 1;
  77.    
  78.     }
  79.    
  80.     else if ( c == ')' ){
  81.          
  82.          return -1;
  83.          
  84.     }
  85.    
  86.     else return 0;
  87.    
  88. }
  89.  
  90. int precedencia (char operador1, char operador2){
  91.    
  92.     if ( ( operador1 == '*' || operador1 == '/' ) && ( operador2 == '+'
  93.    
  94.     || operador2 == '-' ) ) return 1; //Precedencia del operador 1 mayor
  95.    
  96.     else if ( ( operador1 == '+' || operador1 == '-' ) && ( operador2 == '*'
  97.    
  98.     || operador2 == '/' ) ) return 0; //Precedencia del operador 1 menor
  99.    
  100.     else return -1; //Precedencia del operador 1 igual que la del operador 2
  101.  
  102. }
  103.  
  104. void inFijo2postFijo (char inFijo[], char postFijo[]){
  105.      
  106.      ptrNuevaPila pila = NULL;
  107.      
  108.      int i = 0, j = 0;
  109.      
  110.      empujar_pila ( &pila, '(' );
  111.      
  112.      inFijo = (char*)
  113.      
  114.      realloc (inFijo, ( ( ( tam_infijo (inFijo) ) + 2 ) * sizeof (char) ) );
  115.      
  116.      inFijo [tam_infijo (inFijo)] = ')';
  117.      
  118.      inFijo [tam_infijo (inFijo) + 1] = '\0';
  119.      
  120.      while ( pila != NULL ){
  121.            
  122.            if ( esOperador ( inFijo [i] ) ){
  123.                
  124.                 while ( ( esOperador ( pila->dato ) ) && (
  125.                
  126.                 precedencia (inFijo [i], pila->dato ) == 0 ||
  127.                
  128.                 precedencia (inFijo [i], pila->dato ) == -1 ) ) {
  129.                            
  130.                             postFijo [j] = pila->dato;
  131.                            
  132.                             j++;
  133.                            
  134.                             sacar_pila( &pila );
  135.                            
  136.                 }
  137.                
  138.                 empujar_pila ( &pila, inFijo [i] );
  139.                
  140.            }
  141.            
  142.            else if ( esParentesis ( inFijo [i] ) ){
  143.                
  144.                 if ( esParentesis ( inFijo [i] ) == 1 ){
  145.                      
  146.                      empujar_pila ( &pila, inFijo [i] );
  147.                      
  148.                 }
  149.                
  150.                 else{
  151.                      
  152.                      while ( pila->dato != '(' && esOperador ( pila->dato ) ){
  153.                            
  154.                            postFijo [j] = pila->dato;
  155.                            
  156.                            j++;
  157.                            
  158.                            sacar_pila ( &pila );
  159.                            
  160.                      }
  161.                      
  162.                      sacar_pila ( &pila );
  163.                      
  164.                 }
  165.                
  166.            }
  167.            
  168.            else{
  169.  
  170.                 postFijo [j] = inFijo [i];
  171.                
  172.                 j++;
  173.                
  174.            }
  175.            
  176.            i++;
  177.            
  178.      }
  179.      
  180.      postFijo [j] == '\0';
  181.      
  182. }
  183.  
  184. //##############################################################################
  185.  
  186. //##############################MAIN############################################
  187.  
  188. int main (){
  189.    
  190.     char * infijo = scan_infijo ();
  191.    
  192.     char postFijo [tam_infijo(infijo)+1];
  193.    
  194.     inFijo2postFijo(infijo, postFijo);
  195.    
  196.     printf ("%s", postFijo);
  197.    
  198.     getchar();
  199.    
  200.     return 0;
  201.    
  202. }
  203.  
  204. //##############################################################################
  205.  

Enlace de estructuras.h :

http://www.megaupload.com/?d=N31B614Z

Un saludo!!
« última modificación: Lunes 25 de Julio de 2011, 20:58 por Checho360 »

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Infijo a postfijo
« Respuesta #1 en: Martes 26 de Julio de 2011, 03:39 »
0
Ya está resuelto, no hace falta que nadie responda