elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Notación Polaca Inversa
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Notación Polaca Inversa  (Leído 6,350 veces)
Rudy21

Desconectado Desconectado

Mensajes: 154


Rudy21 Web Design


Ver Perfil WWW
Notación Polaca Inversa
« 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;
}



« Última modificación: 15 Septiembre 2010, 08:02 am por Rudy21 » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Notacion polaca « 1 2 »
Java
xAgramonx 14 33,505 Último mensaje 21 Octubre 2012, 09:09 am
por Rocio Sol
notación polaca inversa
Programación C/C++
david_BS 0 4,592 Último mensaje 31 Marzo 2012, 19:26 pm
por david_BS
[Duda] token/strtok /Notacion Polaca Inversa
Programación C/C++
digitalx2 1 2,482 Último mensaje 23 Septiembre 2013, 19:10 pm
por eferion
Problema con la notación de punteros
Programación C/C++
apoeti 5 3,022 Último mensaje 11 Julio 2014, 00:32 am
por apoeti
notacion JSON error
PHP
geshiro 1 3,001 Último mensaje 18 Mayo 2016, 10:10 am
por moikano→@
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines