Sábado 14 de Diciembre de 2024, 12:27
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
evaluar expresion postfija
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: evaluar expresion postfija (Leído 10090 veces)
antlcn
Nuevo Miembro
Mensajes: 12
evaluar expresion postfija
«
en:
Domingo 30 de Mayo de 2010, 16:14 »
0
hola, necesito hacer un programa en C al que le introduzcas una expresion postfija y te devuelva el resultado la expresion se guarda en una cadena con expacios entre cada dato introducido con un caracter final de parada "f", y no me funciona el programa, a ver si alguien sabe en que fallo.
Código: C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct
pila
{
int
n
;
struct
pila
*
sig
;
}
;
void
apilar
(
struct
pila
**
cabeza
,
int
n
)
;
struct
pila
*
nuevoElemento
(
)
;
int
desapilar
(
struct
pila
**
cabeza
)
;
int
pilaVacia
(
struct
pila
*
cabeza
)
;
int
operacion
(
int
n1
,
int
n2
,
char
caract
)
;
void
conversion
(
struct
pila
*
cabeza
,
char
cad
[
]
)
;
void
mostrarPila
(
struct
pila
**
cabeza
)
;
int
main
(
void
)
{
int
res
;
struct
pila
*
operandos
=
NULL
;
char
expresion
[
15
]
;
printf
(
"nIntroduce la expresion separada por espacios: "
)
;
gets
(
expresion
)
;
printf
(
"nOk...getsn"
)
;
conversion
(
operandos
,
expresion
)
;
mostrarPila
(
&
operandos
)
;
printf
(
"nOk..conversionn"
)
;
res
=
desapilar
(
&
operandos
)
;
printf
(
"nOk...resultadon"
)
;
printf
(
"nEl resultado de la expresion es: %dn"
,
res
)
;
return
0
;
}
struct
pila
*
nuevoElemento
(
)
{
return
(
struct
pila
*
)
malloc
(
sizeof
(
struct
pila
)
)
;
}
void
apilar
(
struct
pila
**
cabeza
,
int
n
)
{
struct
pila
*
nuevo
=
NULL
;
nuevo
=
nuevoElemento
(
)
;
nuevo
->
n
=
n
;
nuevo
->
sig
=*
cabeza
;
*
cabeza
=
nuevo
;
}
int
desapilar
(
struct
pila
**
cabeza
)
{
int
n
;
struct
pila
*
aux
=
NULL
;
n
=
(
*
cabeza
)
->
n
;
aux
=*
cabeza
;
*
cabeza
=
aux
->
sig
;
free
(
aux
)
;
return
n
;
}
int
pilaVacia
(
struct
pila
*
cabeza
)
{
if
(
cabeza
==
NULL
)
return
0
;
return
1
;
}
int
operacion
(
int
n1
,
int
n2
,
char
caract
)
{
int
r
;
if
(
caract
==
'*'
)
r
=
n1
*
n2
;
if
(
caract
==
'-'
)
r
=
n1
-
n2
;
if
(
caract
==
'+'
)
r
=
n1
+
n2
;
if
(
caract
==
'/'
)
r
=
n1
/
n2
;
return
r
;
}
void
conversion
(
struct
pila
*
cabeza
,
char
cad
[
]
)
{
int
n1
,
n2
,
nuevo
,
i
=
0
;
while
(
cad
[
i
]
!=
'f'
)
{
if
(
cad
[
i
]
>
47
&&
cad
[
i
]
<
57
)
apilar
(
&
cabeza
,
cad
[
i
]
)
;
if
(
cad
[
i
]
>
41
&&
cad
[
i
]
<
47
)
{
n1
=
desapilar
(
&
cabeza
)
;
n2
=
desapilar
(
&
cabeza
)
;
nuevo
=
operacion
(
n1
,
n2
,
cad
[
i
]
)
;
apilar
(
&
cabeza
,
nuevo
)
;
}
i
++;
}
}
void
mostrarPila
(
struct
pila
**
cabeza
)
{
struct
pila
*
aux
=
NULL
;
aux
=*
cabeza
;
while
(
aux
!=
NULL
)
{
printf
(
"n%d"
,
aux
->
n
)
;
}
}
un saludo.
gracias de antemano.
Tweet
czealt
Miembro activo
Mensajes: 28
Re: evaluar expresion postfija
«
Respuesta #1 en:
Jueves 10 de Junio de 2010, 06:26 »
0
..Los errores que hacen que el programa no funcione estan en la funcion conversion():
Código: C
void
conversion
(
struct
pila
*
cabeza
,
char
cad
[
]
)
/* esta funcion modifica la pila asi que el argumento cabeza deberia ser declarado como struct pila **cabeza */
{
int
n1
,
n2
,
nuevo
,
i
=
0
;
while
(
cad
[
i
]
!=
'f'
)
{
if
(
cad
[
i
]
>
47
&&
cad
[
i
]
<
57
)
apilar
(
&
cabeza
,
cad
[
i
]
)
;
/* Aqui se esta apilando el codigo ASCII del digito en lugar de su valor */
if
(
cad
[
i
]
>
41
&&
cad
[
i
]
<
47
)
{
n1
=
desapilar
(
&
cabeza
)
;
/* El operando que se desapila primero debe ser n2*/
n2
=
desapilar
(
&
cabeza
)
;
nuevo
=
operacion
(
n1
,
n2
,
cad
[
i
]
)
;
apilar
(
&
cabeza
,
nuevo
)
;
}
i
++;
}
}
Tambien se deberia verificar si el segundo operando de la operacion / es cero para evitar dividir por 0.
El programa corregido:
Código: C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum
{
DIVCERO
=
1
}
;
const
char
*
msjerror
[
]
=
{
"Division por cero"
}
;
int
erroreval
=
0
;
struct
pila
{
int
n
;
struct
pila
*
sig
;
}
;
void
apilar
(
struct
pila
**
cabeza
,
int
n
)
;
struct
pila
*
nuevoElemento
(
)
;
int
desapilar
(
struct
pila
**
cabeza
)
;
int
pilaVacia
(
struct
pila
*
cabeza
)
;
int
operacion
(
int
n1
,
int
n2
,
char
caract
)
;
void
conversion
(
struct
pila
**
cabeza
,
char
cad
[
]
)
;
void
mostrarPila
(
struct
pila
**
cabeza
)
;
int
main
(
void
)
{
int
res
;
struct
pila
*
operandos
=
NULL
;
char
expresion
[
15
]
;
printf
(
"nIntroduce la expresion separada por espacios: "
)
;
gets
(
expresion
)
;
printf
(
"nOk...getsn"
)
;
conversion
(
&
operandos
,
expresion
)
;
mostrarPila
(
&
operandos
)
;
if
(
erroreval
)
{
printf
(
"Error de evaluacion: %sn"
,
msjerror
[
erroreval
-
1
]
)
;
}
else
{
printf
(
"nOk..conversionn"
)
;
res
=
desapilar
(
&
operandos
)
;
printf
(
"nOk...resultadon"
)
;
printf
(
"nEl resultado de la expresion es: %dn"
,
res
)
;
}
return
0
;
}
struct
pila
*
nuevoElemento
(
)
{
return
(
struct
pila
*
)
malloc
(
sizeof
(
struct
pila
)
)
;
}
void
apilar
(
struct
pila
**
cabeza
,
int
n
)
{
struct
pila
*
nuevo
=
NULL
;
nuevo
=
nuevoElemento
(
)
;
nuevo
->
n
=
n
;
nuevo
->
sig
=*
cabeza
;
*
cabeza
=
nuevo
;
}
int
desapilar
(
struct
pila
**
cabeza
)
{
int
n
;
struct
pila
*
aux
=
NULL
;
n
=
(
*
cabeza
)
->
n
;
aux
=*
cabeza
;
*
cabeza
=
aux
->
sig
;
free
(
aux
)
;
return
n
;
}
int
pilaVacia
(
struct
pila
*
cabeza
)
{
if
(
cabeza
==
NULL
)
return
0
;
return
1
;
}
int
operacion
(
int
n1
,
int
n2
,
char
caract
)
{
int
r
;
erroreval
=
0
;
if
(
caract
==
'*'
)
r
=
n1
*
n2
;
if
(
caract
==
'-'
)
r
=
n1
-
n2
;
if
(
caract
==
'+'
)
r
=
n1
+
n2
;
if
(
caract
==
'/'
)
// verificar que n2 no sea 0
{
if
(
n2
!=
0
)
r
=
n1
/
n2
;
else
erroreval
=
DIVCERO
;
}
return
r
;
}
void
conversion
(
struct
pila
**
cabeza
,
char
cad
[
]
)
{
int
n1
,
n2
,
nuevo
,
i
=
0
;
while
(
cad
[
i
]
!=
'f'
)
{
if
(
cad
[
i
]
>=
'0'
&&
cad
[
i
]
<=
'9'
)
// es digito?
apilar
(
cabeza
,
cad
[
i
]
-
'0'
)
;
// convertir a entero antes de apilar
if
(
cad
[
i
]
==
'+'
||
cad
[
i
]
==
'-'
||
cad
[
i
]
==
'*'
||
cad
[
i
]
==
'/'
)
{
// es operacion?
n2
=
desapilar
(
cabeza
)
;
n1
=
desapilar
(
cabeza
)
;
nuevo
=
operacion
(
n1
,
n2
,
cad
[
i
]
)
;
apilar
(
cabeza
,
nuevo
)
;
}
i
++;
}
}
void
mostrarPila
(
struct
pila
**
cabeza
)
{
struct
pila
*
aux
=
NULL
;
aux
=*
cabeza
;
while
(
aux
!=
NULL
)
{
printf
(
"n%d"
,
aux
->
n
)
;
aux
=
aux
->
sig
;
}
}
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
evaluar expresion postfija