You are on page 1of 8

1.

Introduccin
Para nuestro problema una expresin matemtica ser un medio que permite indicar el
orden en que se deben realizar una serie de operaciones para obtener un resultado. Las
operaciones se indican mediante operadores, que en nuestro caso representan las
operaciones suma, resta, producto, divisin e igualdad, todas ellas operaciones binarias
(necesitan exactamente dos argumentos para poderse evaluar).
Existen varias notaciones para representar expresiones matemticas, que se diferencian en
el orden en que se escriben los argumentos (operandos) de los operadores. Las ms
relevantes son:
Notacin infija: La notacin habitual. El orden es primer operando, operador,
segundo operando.
Notacin prefija: El orden es operador, primer operando, segundo operando.
Notacin postfija: El orden es primer operando, segundo operando, operador.
Notacin funcional: Se escribe el operador/funcin y despues, entre parntesis, los
operadores separados por comas.
La notacin infija tiene el problema de que en expresiones con ms de un operador existe
ambiguedad sobre cual es el orden de evaluacin. Por ejemplo, la expresin 8/4/2 se puede
interpretar como (8/4)/2 o bien como 8/(4/2). Las otras notaciones no sufren este problema.
Para resolver estas ambiguedades, se aaden unas reglas denominadas orden de
precedencia de operadores. Cuando dos operadores compiten por el mismo operando (en el
ejemplo anterior, el primer y el segundo operador de divisin se disputan el operando 4)
gana el el operador (se evala primero) con mayor precedencia, o a igualdad de
precedencia, el operador situado ms a la izquierda.
Las reglas de precedencia habituales son que los operadores divisin y producto tienen
igual precedencia y ganan al resto de operadores, y que los operadores suma y resta tienen
igual precedencia y ganan al operador igualdad.
As, la expresin 8/4/2 se evala como (8/4)/2, y 2+3*4 se evala como 2+(3*4). Si
deseamos cambiar el orden de evaluacin, se pueden agrupar partes de una expresin
utilizando parntesis. En el resto de las notaciones no es necesario utilizar parntesis ya que
siempre podemos indicar el orden exacto de evaluacin sin que exista ambiguedad.
Por ejemplo, si deseamos representar las expresiones (2+(3*4)) = x y ((2+3)*4)= x en las
cuatro notaciones mencionadas, el resultado sera:
(2+(3*4)) = x ((2+3)*4) = x
Notacin prefija = + 2 * 3 4 x = * + 2 3 4 x
Notacin infija 2+3*4 = x (2+3)*4 = x
Notacin postfija 2 3 4 * + x = 2 3 + 4 * x =
Notacin funcional igual(suma(2,producto(3,4)),x) igual(producto(suma(2,3),4),x)
Generalmente a la hora de traducir una expresin en notacin infija a su representacin
como arbol binario se suele efectuar un primer paso de traduccin a una notacin ms
adecuada (generalmente a notacin prefija o postfija), y luego se traduce la expresin en
esa notacin a arbol binario.
Las dos etapas anteriores se pueden realizar directamente mediante un algoritmo recursivo,
o en dos pasos utilizando estructuras adicionales (generalmente pilas).
2. Algoritmo recursivo
Es posible traducir directamente una expresin en notacin infija a un arbol binario
mediante uno o varios subprogramas recursivos, aunque el algoritmo no es trivial. En lugar
de intentar desarrollar un nico subprograma que analize completamente una expresin,
suele ser ms sencillo utilizar un enfoque ligeramente distinto, utilizando dos
subprogramas:
El primero de ellos se encargara de asignar el operando derecho a un operador, el
cual se proporciona como un arbol binario al que le falta el hijo derecho, utilizando
para ello la lista de trminos correspondiente a la parte de la expresin que falta por
traducir. El resultado del subprograma ser el arbol binario completado y la lista de
trminos que faltan por analizar.
El segundo subprograma traduce parte o toda una expresin en un arbol binario, que
pasa a considerarse como operando. Una expresin en notacin infija responde al
esquema N
1
O
1
N
2
O
2
N
3
..., donde los trminos N
i
son operandos y los trminos O
i

operadores. Este subprograma construiria el arbol binario asignando N
1
como
operando izquierdo de O
1
, y llamara al subprograma anterior para encontrar el
operando derecho de O
1
. Por ejemplo, en la expresin 2*3+4, el operando derecho
del producto es 3, pero en la expresin 2+3*4 el operando derecho de la suma es el
arbol binario (3*4).
Si en algun momento aparece un parntesis izquierdo en lugar de un operando, se
llamara al segundo subprograma para que traduzca esa subexpresin al arbol
binario correspondiente, que pasa a considerarse como el operando que faltaba.
3. Conversion de notacion infija a postfija
El siguiente algoritmo en pseudocdigo traduce una expresin en notacin infija a notacin
postfija, como paso previo a la obtencin del arbol binario correspondiente a la expresin:
Entrada: Una lista que contiene los terminos de la ecuacion en notacin infija (la
notacin habitual).
Salida: Una lista que contiene los terminos de la ecuacion en notacion postfija.
Datos locales: Una pila, que va a contener operadores y parentesis izquierdos.
INICIO
Crear pila y la lista de salida, inicialmente vacias.
MIENTRAS lista de entrada no este vacia y
no se ha encontrado ningun error HACER
Extraer el primer termino de la lista (lo llamaremos E)
SEGUN-SEA E
CASO E es nmero :
Insertar E al final de la lista de salida
CASO E es la variable x :
Insertar E al final de la lista de salida
CASO E es un parntesis izquierdo :
Insertar E en la pila
CASO E es un parntesis derecho :
MIENTRAS La pila no este vaca y
su cima no sea un parntesis izquierdo HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
SI Encontramos el parentesis izquierdo ENTONCES
Extraerlo de la pila y destruirlo
SINO
Se ha detectado un ERROR 2
FIN-SI
Destruir E
CASO E es un operador :
MIENTRAS La pila no este vaca y
su cima sea un operador
de precedencia mayor o igual que la de E HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
Insertar E en la pila
FIN-SEGUN-SEA
FIN-MIENTRAS
MIENTRAS Pila no est vaca HACER
Extraer elemento de la pila
Insertarlo al final de la lista de salida
FIN-MIENTRAS
Destruir pila
FIN
A continuacin se muestra el estado de la lista de entrada, la lista de salida y la pila en cada
iteracin del bucle principal del algoritmo al dar como entrada la lista de trminos
correspondiente al ejemplo del enunciado de la prctica. En color rojo se muestra el
trmino que se procesa en cada iteracin, y en color verde los trminos que se han aadido
a la lista de salida o a la pila como consecuencia de las acciones realizadas en la iteracin
anterior:
-4 * ( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2

* ( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 -4
( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 -4 *
-5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 -4 ( *
- 2 ) / ( -1 * x - -3 ) = -1 / -2 -4 -5 ( *
2 ) / ( -1 * x - -3 ) = -1 / -2 -4 -5 - ( *
) / ( -1 * x - -3 ) = -1 / -2 -4 -5 2 - ( *
/ ( -1 * x - -3 ) = -1 / -2 -4 -5 2 - *
( -1 * x - -3 ) = -1 / -2 -4 -5 2 - * /
-1 * x - -3 ) = -1 / -2 -4 -5 2 - * ( /
* x - -3 ) = -1 / -2 -4 -5 2 - * -1 ( /
x - -3 ) = -1 / -2 -4 -5 2 - * -1 * ( /
- -3 ) = -1 / -2 -4 -5 2 - * -1 x * ( /
-3 ) = -1 / -2 -4 -5 2 - * -1 x * - ( /
) = -1 / -2 -4 -5 2 - * -1 x * -3 - ( /
= -1 / -2 -4 -5 2 - * -1 x * -3 - /
-1 / -2 -4 -5 2 - * -1 x * -3 - / =
/ -2 -4 -5 2 - * -1 x * -3 - / -1 =
-2 -4 -5 2 - * -1 x * -3 - / -1 / =
-4 -5 2 - * -1 x * -3 - / -1 -2 / =

-4 -5 2 - * -1 x * -3 - / -1 -2 / =
Nota: El algoritmo anterior no puede detectar errores relacionados con la ausencia de
parntesis de cierre. Aunque con una pequea modificacin es posible detectarlos, se ha
preferido hacerlo en la siguiente etapa:
4. Traduccin de notacin postfija a arbol binario
Entrada: La lista obtenida en el algoritmo anterior, que contiene los terminos de la
ecuacion en notacin postfija.
Salida: Un arbol binario que representa la ecuacin.
Datos locales: Una pila, que va a contener operandos (numeros, la variable x y
expresiones (subarboles).
INICIO
Crear pila y arbol, inicialmente vacios.
MIENTRAS lista de entrada no este vacia y
no se ha encontrado ningun error HACER
Extraer el primer termino de la lista (lo llamaremos E)
SEGUN-SEA E
CASO E es nmero :
Insertar E en la pila
CASO E es la variable x :
Insertar E en la pila
CASO E es una expresin (un arbol) :
Insertar E en la pila
CASO E es un parntesis izquierdo :
Se ha detectado un ERROR 2
CASO E es un operador :
SI La pila tiene menos de dos elementos ENTONCES
Se ha detectado un ERROR 3
SINO
Extraer elemento de la pila (lo llamaremos A2)
Extraer elemento de la pila (lo llamaremos A1)
Crear un arbol donde la raiz contenga al operador E,
el hijo izquierdo sea A1 y el hijo derecho sea A2
Insertar el arbol en la pila
FIN-SI
FIN-SEGUN-SEA
FIN-MIENTRAS
SI pila vaca o con ms de un elemento ENTONCES
Se ha detectado un ERROR 3
SINO
Extraer elemento de la pila (lo llamaremos E)
SI Elemento no es una expresin (un arbol) ENTONCES
Convertir E en un arbol con hijo izquierdo y derecho vacos
FIN-SI
El resultado del algoritmo (el arbol de salida) es E
FIN-SI
{ Borrado de la pila, si se ha producido error }
MIENTRAS pila no est vaca HACER
Extraer elemento de la pila
Destruir elemento
FIN-MIENTRAS
Destruir pila
FIN
A continuacin se muestra el estado de la lista de entrada y la pila al ejecutar el algoritmo
anterior sobre la lista de terminos en notacin postfija obtenidos anteriormente. Para
abreviar el listado, cuando varios trminos consecutivos de la lista son operandos se han
agrupado las iteraciones correspondientes en una nica linea:
-4 -5 2 - * -1 x * -3 - / -1 -2 / =

- * -1 x * -3 - / -1 -2 / = 2 -5 -4
* -1 x * -3 - / -1 -2 / =

-4

-1 x * -3 - / -1 -2 / =


* -3 - / -1 -2 / = x -1


-3 - / -1 -2 / =



- / -1 -2 / = -3



/ -1 -2 / =


-1 -2 / =


/ = -2 -1


=





El resultado es el arbol binario resultante de extraer el nico termino existente en la pila.
5. Traduccin de expresiones ms complejas
Aunque no es necesario para la realizacin de la prctica, se ha incluido este apartado para
aquellos que deseen saber cmo ampliar los algoritmos anteriores para el tratamiento de
expresiones ms complejas, que incluyan variables, excepciones a la regla de precedencia,
operadores unarios y funciones.
Variables: En los ejemplos anteriores slo estaba permitido utilizar una variable,
denominada x. Si se desea utilizar cualquier nmero de variables con otros nombres,
lo nico que se necesita es adaptar la definicin del trmino de tipo variable para
que almacene una cadena de caracteres correspondiente a su nombre. No es
necesario cambiar ninguno de los algoritmos anteriores.
Excepciones a las reglas de precedencia: Los operadores potencia y asignacin
presentan excepciones a la regla de precedencia. Cuando el operador potencia
compite con otro operador potencia por un operando, gana el operador situado ms
a la derecha en la expresin, al contrario de lo habitual. Por ejemplo, la expresin
2^3^4 se interpreta como 2^(3^4).
El operador asignacin (Nota: Nos referimos al operador matemtico, no al
operador de Pascal) tiene definida la mayor precedencia posible respecto a los
operandos que estn a su izquierda, y la menor precedencia posible respecto a los
que estn a su derecha. Por ejemplo, la expresin a+b <- c+d se interpreta como
a+(b <- (c+d)).
Para tratar estos casos lo ms sencillo es definir, para cada operador, dos valores de
precedencia: La precedencia izquierda (que se aplica a los operandos situados a la
izquierda del operador) y la precedencia derecha (que se aplica a los operandos
situados a la derecha). Al comparar la precedencia de dos operadores, se debe
escoger los valores de precedencia izquierda o derecha para cada uno de ellos
dependiendo de como estn situados respecto al operando.
Operadores unarios: Los operadores unarios (negacin, factorial, etc.) se suelen
tratar usando los valores de precedencia derecha e izquierda definidos en el punto
anterior. Para ello, se da un valor negativo a la precedencia que corresponda a un
operando que, por su posicion respecto del operador unario, no pueda ser argumento
suyo. Por ejemplo, el operador negacion no se aplica sobre operandos situados a su
izquierda, ni el operador factorial sobre operandos situados a su derecha.
Los algoritmos anteriores se deben cambiar de forma que cuando un operador
unario reciba un operando se considere completo (y por lo tanto pase a considerarse
un operando). Cualquier disputa entre operadores sobre un operando se trata de la
manera habitual, ya que los valores de precedencia asignados garantizan la correcta
asignacin de operandos a operadores.
Funciones: Las funciones se representan mediante un nombre al que le sigue un
nmero variable de argumentos separados por comas y encerrados entre parntesis.
En principio parece que no es posible traducir directamente funciones con los
algoritmos anteriores, ni representarlas adecuadamente mediante rboles binarios,
ya que pueden tener ms de dos argumentos.
Sin embargo, si hacemos que el smbolo coma represente el operador binario lista
de argumentos y representamos las funciones como operadores unarios que se
aplican al operando derecho, los algoritmos anteriores pueden representar funciones
sin necesidad de ninguna modificacin.

You might also like