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):

4+5*3*(8-2)/2

en algo del tipo (notación postfija o Polaca Inversa o RPN):

4 5 3 * 8 2 - 2 * / +

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.