Cita de: digitalx2 en 22 Septiembre 2013, 22:31 PM
mi input es:
5 6 9 + 8 5 *
esto quedaria como
5 11 40
O se me ha olvidado sumar o esto debería quedar tal que:
5 15 40
Es importante porque si no puedes ponerte a buscar errores donde no los hay.
Más cosillas. Como norma general los índices se tiende a incrementarlos despues de añadir el elemento al vector... no antes. Básicamente porque si se produce un problema mientras añades el elemento al vector al final tienes que acordarte de volver a reducir el valor del puntero... y es preferible perder un dato a recuperar un valor no inicializado. Esto te lo digo por el uso que haces de index.
Código (c) [Seleccionar]
ptr = strtok( s, s2); /* Primera llamada => Primer token*/
printf( "%s\n", ptr );
while( (ptr = strtok( NULL, s2 )) != NULL ) /*Posteriores llamadas*/
El problema que te va a generar esta estructura es que el primer token lo vas a perder... prueba a meter esta secuencia 5 5 +... no funciona.
Si quieres convservar el primer token, que imagino que sí, usa un bucle dowhile...
Código (c) [Seleccionar]
ptr = strtok( s, s2); /* Primera llamada => Primer token*/
printf( "%s\n", ptr );
do
{
// Aqui aun conservas el primer token, en las siguientes pasadas
// tendras los siguientes tokens
// ...
}
while( (ptr = strtok( NULL, s2 )) != NULL ) /*Posteriores llamadas*/
Otra cosa más. La función 'isdigit' solamente comprueba un caracter... luego si tienes pensado permitir la entrada de números de dos o más dígitos tendrás que comprobar todo el token para evitar errores.
Y para terminar un último fallo:
Código (c) [Seleccionar]
stackEntry pop(Stack*s)
{
if(isEmpty(*s)){printf("error: stack empty\n"); return -1;}
printf("\npop: %d\n",s->data[s->index--]);
return 1;
}
Mola esta función... imagínate una pila con elementos aleatorios... haz un pop y te adivino lo que te va a devolver esta función: siempre 1... bueno, al menos mientras queden elementos en el stack.
ese return 1 no debería estar así... la función más bien debería tener una forma tal que:
Código (c) [Seleccionar]
stackEntry pop(Stack*s)
{
if(isEmpty(*s)){printf("error: stack empty\n"); return -1;}
stackEntry dato = s->data[s->index--];
printf("\npop: %d\n",dato);
return dato;
}
Y para rematar unos consejos:
* no pongas varias instrucciones en la misma línea... queda feo, generas código menos legible y que además es más complicado de depurar y no vas a ganar espacio. Una línea, una instrucción... hazme caso que lo vas a agradecer.
* Elimina variables sin uso: no aportan nada al código y dificultan su lectura: i, op2, type.
Un saludo.