| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
dpm110293
Registrado: 18 Feb 2013 Mensajes: 1
| Publicado: 18/02/2013 8:36 pm | | | Título: Problemas algoritmo de infija a posfija (con pilas) |
| Hola a todos, quiero saber cual es el problema con el siguiente codigo que implemente, ya que al ejecutarlo y darle la expresion en infija, imprime basura y no hace nada, ya lo vi varias veces y no encuentro cual es mi error
Saludos y muchas gracias!!
#include<stdio.h> #include "Pila.h"
int esoperando(Elem e){ return esmin(e)||esdig(e); } int esmin(Elem e){ return(e>='a') && (e<='z'); } int esdig(Elem e){ return (e>='0')&&(e<='9'); } int espari(Elem e){ return (e=='('); } int espard(Elem e){ return (e==')'); } int esoperador(Elem e){ return (e=='*')||(e=='/')||(e=='+')||(e=='-'); } int prec(Elem e){ if(e=='!') return 3; else{ if((e=='/')||(e=='*')) return 2;
else { if((e=='+')||(e=='-'))
return 1; } } }
int main(int argc ,char *argv[]){ int i=0; Pila p=empty(); char *in=*(argv+1); while(in[i++]!='\0'){ if(esoperando(in[i++])) putchar(in[i]);
else if(esoperador(in[i++])){ if(isempty(p)) p=push((in[i]),p); else{ if((prec(in[i++])>=(prec(top(p))))) p=push((in[i]),p); else{ if((prec(in[i++])>=(prec(top(p))))) p=pop(p); } } } else{ if(espard(in[i++])){ while(!espari(in[i])){ p=pop(p); putchar(in[i]); } } } i++; //pElem(in[i],p); } while(!isempty(p)){ //putchar(top(p)); putchar(top(p)); p=pop(p); //i++; // puts(in); } while(in[i]!='\0'){ putchar(in[i++]); // puts(in); //i++; } puts(in); return 0; } |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7530 Ubicación: Mexico
| Publicado: 19/02/2013 9:33 am | | | Título: |
| Hola
Bienvenido a los foros. Por favor lee sus reglas.
A primera vista el problema principal es el incremento del contador "i", es un verdadero caos ya que no permite procesar la cadena carácter a carácter. Por ejemplo en la primera iteracion del bucle el contador toma el valor indicado por los comentarios:
| Código: | /* i == 0 */ while (in[i++] != '\0') { /* i == 1 */ if (esoperando (in[i++]) ) putchar (in[i]); /* ... */ } /* i == 2 */ i++; /* i == 3 */ } |
No parece difícil solucionarlo pero, para verificar de forma completa el programa, primero debes publicar el código fuente del archivo de inclusión "Pila.h".
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |