Estructura de Datos y Algoritmos
1er. Sem 2003
Tarea 4: Evaluación de expresiones aritméticas usando Reverse Polish
Notation (RPN)
A través de esta tarea usted experimentará con listas doblemente enlazasa como estructura de datos y stacks como tipo de dato abstracto.
Desarrolle el testAritmetico, el cual puede ser usado para evaluar las habilidades de estudiantes para resolver problemas aritméticos. Éstos son problemas en que participan las cuatro operaciones básicas (+,-,*,/). La división considérela entera.
Sintaxis: testAritmetico <ejercicios> [v]
Usted recibirá como entrada un archivo con una expresión aritmética por línea y del tipo:
2+3*5*(6-2)
(6-4)/(10-8)
3*15+5*4-7*12
etc...
testAritmetico presentará en pantalla la expresión y esperará que el usuario
ingrese al respuesta. Luego indicará al usuario si su respuesta fue correcta
o no. En caso de error, dará una segunda oportunidad y pasará a la siguiente.
Una vez que se llegue al fin del archivo, el programa mostrará la estadística
de su test en dos porcentajes (100* respuestas buenas/total). El primero indica
la nota cosiderando las primeras respuestas y el segundo la nota anulando
las primeras respuestas erradas.
Implemente ambos stacks (requerirá uno para caracteres y otro para enteros)
en archivos separados (serán iguales excepto que uno manejará caracteres y
el otro enteros.
El argumento v es una opción del programa. Cuando está presente
el programa se limita a recorrer las expresiones del archivo e indica si hay
o no errores sintácticos. Las expresiones con error son mostradas por pantalla
indicando el número de la línea del archivo donde se ubicó el error.
Información comprementaria para el desarrollo de la tarea
La evaluación de expresiones aritméticas no es una tarea trivial. Existen
al menos dos métodos para hacerlo. Uno de ellos se basa en procedimientos
con llamados recursivos y el otro se basa en el uso de Notación Polaca Inversa
y stacks. Ambos métodos, además de evaluar la expresión, hacen una chequeo
de la sintaxis de la expresión ingresada. En esta tarea tares usted deberá
usar el método basado en Notación Polaca Inversa. Entre otras cosas usted
deberá implementar un stack con listas doblemente enlazadas con centinela.
El método en cuestión consta de dos pasos. Primero transforma una expresión
aritmética con notación del tipo (notación infija):
en algo del tipo (notación postfija o Polaca Inversa o RPN):
Una de las gracias de RPN es su presindencia de paréntesis. Además ésta
facilita enormemente la evaluación de tales expresiones.
La base de esta técnica está en la observación que considerando la presendencia
de los operadores toda expresión aritmética se le puede asociar un árbol sintáctico.
En este daso el árbol sería:
+
/ \
4 /
/ \
* 2
/ \
* -
/ \ / \
5 3 8 2
Si recorremos este árbol en orden infijo y en cada nodo interno vamos almacenando
el resultado de operar el resultado del cada hijo, al llegar a la raiz tendremos
la evaluación de la expresión. Cabe notar que la notación infica requiere
paréntesis, sin embargo el recorrido postfijo no los requiere. La RPN no
es otra cosa que el resultado del recorrido postfijo.
Ahora, para hacer la evaluación de la expresión no necesitamos pasar por el árbol sintáctico. Existe al algoritmo simple que hace la transformación desde la notación infija con paréntesis en la notación RPN. Este algoritmo hace uso de un stack donde se almacenan temporalmente los operadores y los paréntesis (sólo un caracter en nuestro caso). Luego se toma la versión en notación postfija o RPN y es evaluda haciendo uso de otro stack que debe almacenar sólo enteros (en nuestro caso).
Un lugar donde se encuentra el algoritmo específico para ambos pasos es
en los apuntes
de Bob Brown los que he espejado localmente y tomado desde un URL remoto.