You are on page 1of 5

rbol Binario: Construir un Editor de Expresiones.

El mismo debe contener y cumplir con


diferentes requisitos: sern permitidas slo expresiones numricas, sin variables, se
aceptarn las operaciones matemticas de suma (+), multiplicacin (*), resta (-), y divisin
(/) y se debe tener en cuenta los signos de agrupamiento parntesis ( ) y corchetes [ ] en
ese orden de prioridad. Se deber comprobar que la expresin est bien escrita, es decir,
que no hayan expresiones que no sean las que se pueden resolver. Se dar como
resultado la resolucin de esta frmula y tendr que existir un buen nivel de interactividad
con el usuario



En esta prctica procederemos a evaluar expresiones escritas en forma infija (el
operador est situado entre los operandos) con parntesis y con operandos que
sern variables (cada vez que deseemos evaluar la expresin pediremos al
usuario que nos d los valores concretos de las variables para esa evaluacin).
Las operaciones vlidas que evaluaremos sern las operaciones binarias +, -,
*, /.
Expresiones vlidas a evaluar sern, por ejemplo: a + (b - c) / d, (a+b) /
(c-d) * e,...
0. Objetivos
a. Utilizacin del tipo abstracto de datos Arbol binario.
b. Reutilizacin de cdigo (reutilizacin de la clase Pila).
c. Utilizacin de cdigo no desarrollado por el usuario (funcin
infija_a_posfija y clase TablaSimbolos).
d. Trabajo con funciones recursivas.
1. I NTRODUCCI N
Una manera adecuada de representar expresiones aritmticas es a travs de los
rboles binarios de expresiones. Esta representacin retiene de manera natural la
precedencia y la asociatividad de los operadores aritmticos.
En un rbol binario de expresiones cada nodo contiene la informacin de un
elemento de la expresin (un operando o un operador) y la propia estructura del
rbol viene determinada por la forma de la expresin aritmtica.
Un ejemplo de esto lo tenemos en los siguientes rboles de expresiones:

Se puede ver que dependiendo de la colocacin de los parntesis se fuerza el
cambio de precedencia de los operadores y las expresiones generan rboles
distintos.
Tambin es importante resaltar que en el rbol claramente no son necesarios los
parntesis, ya que la precedencia en las operaciones viene dada por la estructura
del rbol.
La evaluacin de las expresiones, es decir, la obtencin de su resultado, se
consigue recorriendo el rbol de expresiones en forma postfija y realizando para
cada nodo que contiene un operador dicha operacin sobre sus hijos. De hecho, si
examinamos el rbol en recorrido post-orden imprimiendo en pantalla el
contenido de cada nodo, obtendremos lo que se denomina la expresin
postfija de la expresin. Las expresiones postfijas de los rboles del ejemplo son
las siguientes:
Para la expresin infija (2+5)*3+1, la expresin postfija es 2 5 + 3 * 1 +
Para la expresin infija 2+5*3+1, la expresin postfija es 2 5 3 * + 1 +
Ntese que la expresin postfija, al igual que ocurra en el rbol, no necesita
utilizar parntesis.
De la misma forma que podemos obtener la expresin postfija a partir del rbol
de expresiones, tambin podemos hacer lo contrario, es decir, obtener el rbol de
expresiones a partir de una expresin postfija. Este hecho va a ser utilizado en la
presente prctica.
2. Realizacin de la prctica
a.- Obtencin de la expresin postfija y la tabla de variables.
El programa deber empezar pidiendo la expresin aritmtica en forma infija que
deseamos evaluar.
Una vez guardada la expresin en una variable de tipo string pasaremos la
expresin a su forma postfija y extraeremos de la expresin una tabla con las
variables utilizadas en la expresin Utilizaremos para ello una funcin
proporcionada por el profesor de prcticas infijo_a_posfijo. El prototipo de
esta funcin es:
bool infijo_a_posfijo (string , string &, TablaSimbolos &);
Esta funcin tiene una entrada que es la cadena de la expresin infija.
Como salidas de la funcin tenemos tres valores (dos devueltos por referencia y
uno como resultado de la funcin):
La primera salida (segundo parmetro de la funcin) es la cadena con la
expresin postfija.
La segunda salida (tercer parmetro de la funcin) es un objeto de
tipo TablaSimbolos que es la tabla donde se almacenan los identificadores
correspondientes a los nombres de cada variable.
La tercera salida (valor devuelto por la funcin) es un valor booleano. La funcin
devuelve true si la expresin esta sintcticamente bien formada o false si
haba algn error sintctico en ella de estos dos tipos:
Nos hemos dejado algn parntesis sin cerrar
El nmero de operadores o de operandos no es el correcto
La funcin no detecta errores como que el orden entre operandos y operadores
sea incorrecto.
b. Paso de la expresin postfija a su representacin mediante un rbol de expresin.
El rbol que vamos a utilizar para guardar la expresin tendr como informacin
en cada uno de sus nodos un carcter, tal y como hemos visto en la introduccin.
Para realizar el paso de la expresin postfija a su representacin en el rbol
vamos a necesitar una pila (de rboles binarios) para construir el rbol binario
que guardar la expresin.
Para conseguirlo realizaremos el siguiente proceso:
Para cada uno de los elementos de la expresin postfija tenemos que hacer
lo siguiente:
Si el elemento analizado es un operando (variable), construimos un rbol binario de
un nico nodo que contiene como informacin el carcter que representa la variable
y como hijos dos subrboles vacos. Este rbol lo apilamos en la pila.
Si el elemento analizado es un operador, construiremos un nuevo rbol de la
siguiente manera:
Extraemos dos elementos de la pila (cada elemento puede ser un rbol complejo si
este procedimiento se ha hecho ya anteriormente).
El primer elemento extrado de la pila ser el hijo derecho del nuevo rbol.
El segundo elemento extrado ser el hijo izquierdo del nuevo rbol
La informacin del nodo raz del nuevo rbol es el carcter que represente la
operacin.
Una vez construido el rbol lo apilamos en la pila.
En el dibujo se detalla el proceso seguido para la obtencin del rbol de
expresin para la expresin algebraica postfija a b + c * d +

Una vez analizados todos los elementos de la expresin en la pila se encontrar
un nico rbol que es el correspondiente rbol de expresin.




http://www.youtube.com/watch?v=1IxIZ9qXEgw
http://informatica.uv.es/iiguia/AED/laboratorio/P6/pr_06_2005.html

http://www.youtube.com/watch?v=sYC1FUIKTUI
http://www.youtube.com/watch?v=h_8WTkH1OV4

You might also like