Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Rudy21 en 15 Septiembre 2010, 07:37 am



Título: Notación Polaca Inversa
Publicado por: Rudy21 en 15 Septiembre 2010, 07:37 am
Buenas! he estado trabajando en este programa que convierte una cadena en notación Infija a notación postfija pero me dá problemas el PUSH!, en linux medice VIOLACIÓN DE SEGMENTO y en windows solo se cuelga el programa

se que son los push, xq si pongo solo números me lo dá (tmb si comento los PUSH)

alguna idea?, que estóy haciendo mal gracias :D
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int push(char *pila, char **tope, int n, char dato)
{
if(pila+n==*tope)
return 1;
else
{
**tope = dato;
(*tope)++;
return 0;
}
}

int pop(char *pila, char **tope, char *dato)
{
if(pila==*tope)
return 1;
else
{
(*tope)--;
*dato= **tope;
return 0;
}
}

int tipoparentesis(char valor)
{
switch (valor)
{
case '(' : return 1;
case ')' : return 1;
case '[' : return 2;
case ']' : return 2;
case '{' : return 3;
case '}' : return 3;
default: return 0;
}
}
int presedencia(char dato, char valor)
{
int x, y, as;
switch (dato)
{
case '+' : x=4; as=1; break;
case '-' : x=4; as=1; break;
case '*' : x=3; as=1; break;
case '/' : x=3; as=1; break;
case '^' : x=2; as=2; break;
default: x=0;
}
switch (valor)
{
case '+' : y=4; break;
case '-' : y=4; break;
case '*' : y=3; break;
case '/' : y=3; break;
case '^' : y=2; break;
}
if( (x <= y && as==1) || (x >= y && as==2) )
{
return 1;
} else {
return 0;
}

}
 

main()
{
char entrada[50], salida[50],temporal[2];
char *pila, *tope, *dato, val;
int i, tam, tam1;
pila = (char *)malloc(sizeof(char)*50);
tope = pila;
printf("Dame tu cadena en infija\n");
scanf("%s",entrada);
tam = strlen(entrada);
for(i=0; i<tam; i++)
{
val = entrada[i];
if (val == '+' || val == '-' || val == '*' || val == '/' || val == '^')
{
nuevo:
if((pop(pila,&tope,dato))== 0)
{
            if (presedencia(*dato,val) == 1)
{
temporal[0]=*dato;
strcat(salida,temporal);
goto nuevo;
} else {
push(pila,&tope,12,*dato);
push(pila,&tope,12,val);
}
} else {
push(pila,&tope,12,val);
}

} else if(val == '(' || val == '[' || val == '{')
{
push(pila,&tope,tam,val);
}

else if ((val == ')') || (val == ']') || (val == '}'))
{
again:
if(tipoparentesis(val) != tipoparentesis(*dato))
goto error;

if((pop(pila,&tope,dato)) != 0)
goto error;

if( (*dato == '(' && val == ')') || (*dato == '[' && val == ']') || (*dato == '{' && val == '}') )
{
} else {
temporal[0]=val;
strcat(salida,temporal);
goto again;
}
} else {
temporal[0]= val;
strcat(salida,temporal);
}
}
while(*tope != *pila)
{
if((pop(pila,&tope,dato)) == 0)
{
if( *dato == '(' || *dato == '[' || *dato == '{')
goto error;

temporal[0]=*dato;
strcat(salida,temporal);
}
}
printf("Tu cadena en postfija es:");
printf("%s\n",salida);
system("pause");
return 0;
error:
printf("Tu ecuación está mal formada");
return 1;
}