Vous êtes sur la page 1sur 7

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

Traduccin de una expresin en un arbol binario


En esta pgina se describen algunos algoritmos que permiten obtener la representacin en arbol binario de una expresin matemtica partiendo de la lista de trminos que la componen expresados en la notacin habitual (notacin infija). El tipo de expresiones que pueden traducir estos algoritmos est limitado a las condiciones expuestas en la prctica del curso 00/01, en el ltimo apartado se exponen algunas tcnicas para que puedan tratar expresiones ms complejas.

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.

1 de 7

09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

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 Notacin prefija Notacin infija Notacin postfija Notacin funcional =+2*34x 2+3*4 = x 234*+x= igual(suma(2,producto(3,4)),x) ((2+3)*4) = x =*+234x (2+3)*4 = x 23+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 N1 O1 N2 O2 N3..., donde los trminos Ni son operandos y los t&eacuterminos Oi operadores. Este subprograma construiria el arbol binario asignando N1 como operando izquierdo de O1, y llamara al subprograma anterior para encontrar el operando derecho de O1. 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.
2 de 7 09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

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
3 de 7 09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

iteracin anterior: -4 * ( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 * ( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 ( -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 -5 - 2 ) / ( -1 * x - -3 ) = -1 / -2 - 2 ) / ( -1 * x - -3 ) = -1 / -2 2 ) / ( -1 * x - -3 ) = -1 / -2 ) / ( -1 * x - -3 ) = -1 / -2 / ( -1 * x - -3 ) = -1 / -2 ( -1 * x - -3 ) = -1 / -2 -1 * x - -3 ) = -1 / -2 * x - -3 ) = -1 / -2 x - -3 ) = -1 / -2 - -3 ) = -1 / -2 -3 ) = -1 / -2 ) = -1 / -2 = -1 / -2 -1 / -2 / -2 -2 -4 -4 -4 -4 -5 -4 -5 -4 -5 2 -4 -5 2 -4 -5 2 - * -4 -5 2 - * -4 -5 2 - * -1 -4 -5 2 - * -1 -4 -5 2 - * -1 x -4 -5 2 - * -1 x * -4 -5 2 - * -1 x * -3 -4 -5 2 - * -1 x * -3 -4 -5 2 - * -1 x * -3 - / -4 -5 2 - * -1 x * -3 - / -1 -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).
4 de 7 09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

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 / = * -1 x * -3 - / -1 -2 / = 2 -5 -4 -4

5 de 7

09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

-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

6 de 7

09/06/11 19:00

Algoritmos de traduccion de expresiones

http://www.infor.uva.es/~cvaca/asigs/AlgInfPost.htm

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.

7 de 7

09/06/11 19:00

Vous aimerez peut-être aussi