APLICACIONES. Notación Polaca y Polaca Inversa. Notación infija A+B C-D E*F G/H Distinción entre (A+B)*C y A+(B*C) de prelación. Con paréntesis y orden Notación Polaca (Jan Lukasiewitz) (Notación prefija) +AB –CD *EF /GH Ejemplo: (A+B)*C Æ [+AB]*CÆ *+ABC A+(B*C) Æ A+[*BC] Æ +A*BC (A+B)/(C-D) Æ [+AB]/[-CD]Æ /+AB-CD Notación Polaca Inversa (Notación Postfija). AB+ CD- EF* GH/ Tampoco se necesitan paréntesis. Un computador normalmente convierte la expresión infija en postfija y después calcula la expresión. Ejemplo : Calculadora HP utiliza operaciones postfijas. Evaluación de expresiones Postfijas. 5* (6+2) -12/4 5* (6+2) -12/4 Æ 5*[6,2,+]-[12,4,/]Æ [5,6,2,+,*]-[ 12,4,/] Æ 5,6,2,+,*,12,4,/,- Programa para la evaluación: En el programa pondremos un valor centinela para saber cuando acaba la expresión. Por ejemplo un paréntesis derecho. ALGORITMO: Encuentra el VALOR de una expresión aritmética P escrita en notación postfija. 1. 2. 3. 4. 5. 6. 7. 8. Añadir un paréntesis derecho “)” al final de P (centinela). Examinar P de izq. A der. Y repetir los pasos 3 y 4 para cada elemento de P hasta que se encuentre el centinela. Si se encuentra un operando, ponerlo en PILA. Si se encuentra un operador ⊗ entonces: a. Sacar los dos operadores superiores de PILA, donde A es el elemento superior y B el siguiente. b. Evaluar B ⊗ A. c. Poner el resultado de (b.) en PILA. Fin del condicional de 4. Fin del bucle de 2. Hacer VALOR igual al elemento superior de PILA. Salir. 5,6,2,+,*,12,4,/,Símbolo examinado 5 6 2 + * 12 4 / ) Pila 5 5,6 5,6,2 5,8 40 40,12 40,12,4 40,3 37 Resultado Pasar de notación infija a postfija (O a Prefija en otros casos. ALGORITMO: POLACA(Q,P). Suponemos que Q es una expresión aritmética escrita en notación infija. Este algoritmo encuentra su expresión postfija P. 1.- Meter "(" en PILA y añadir ")" al final de Q. 2.- Examinar Q de izquierda a derecha y repetir los pasos 3 a 6 para cada elemento de Q hasta que la PILA esté vacia. 3.- Si se encuentra un operando, añadirlo a P. 4.- Si se encuentra paréntesis izquierdo, meterlo en PILA. 5.- Si se encuentra un operador ⊗ entonces: (a) Repetidamente sacar de PILA y añadir a P cada operador (de la cima de PILA) que tenga la misma precedencia o mayor que ⊗. (b) Añadir ⊗ a PILA. [FIN de condicional] 6.- Si se encuentra un paréntesis derecho, entonces: (a) Repetidamente sacar de PILA y añadir a P cada operador (de la cima de PILA) hasta que se encuentre un paréntesis izquierdo. (b) Eliminar el paréntesis izquierdo (no añadir el paréntesis izquierdo a P). [Fin de condicional] [Fin del Bucle del Paso 2] 7.- Salir. EJEMPLO: A+(B*C-(D/E↑f)*g)*H A+([BC*]-[DEF↑/]*G)*H A+([BC*]-[DEF↑/G*])*H A+[(BC*DEF↑/G*-H*)] ABC*DEF↑/G*-H*+ SÍMBOLO EXAM. PILA EXPRESIÓN P A ( A + (+ A ( (+( A B (+( AB * (+(* AB C (+(* ABC - (+(- ABC* ( (+(-( ABC* D (+(-( ABC*D / (+(-(/ ABC*D E (+(-(/ ABC*DE ↑ (+(-(/↑ ABC*DE F (+(-(/↑ ABC*DEF ) (+(- ABC*DEF↑/ * (+(-* ABC*DEF↑/ G (+(-* ABC*DEF↑/G ) (+ ABC*DEF↑/G*- * (+* ABC*DEF↑/G*- H (+* ABC*DEF↑/G*-H ) ABC*DEF↑/G*-H*+ Evaluar expresiones: X=2, Y=5, Z=X+Y; obtener Z X=2, Y=5; Z=(((Y-1)/X)*(X+Y)) Problemas: - ¿Qué se evalúa primero? -> (paréntesis). - ¿Dónde guardamos resultados intermedios? -> En pilas. El proceso a seguir es tener dos pilas, una para operandos y otra para operadores, para su realización es necesario que esté bien parentizado, ya que, consiste en evaluar la expresión y si encontramos un paréntesis izquierdo no hacemos nada, si es un operando lo pasamos a la pila de operandos y si es un operador a la de operadores, de forma que cuando encontremos un paréntesis derecho, hay que realizar una operación, cuyos operandos y operador se encuentran en las pilas, y así sucesivamente. Si la expresión no está realizada con paréntesis hay que tener órdenes de prelación y el algoritmo es un poco más difícil (Ver Estructuras de Datos en JAVA de Weiss). Utilizamos pilas porque necesitamos albergar resultados intermedios pero no sabemos cuantos. La solución es utilizar pilas. ** Copiar una pila en otra. PROCEDURE Copia(VAR P1:Pila; VAR P2:Pila); VAR e:TipoElemento; BEGIN IF NOT EsVacia(P1) THEN BEGIN Cima(P1,e); Desapilar(P1); Copia(P1,P2); Apilar(P1,e); Apilar(P2,e) END ELSE PilaVacia(P2) END; ** Teniendo una pila ponerla al revés. PROCEDURE Invierte(VAR P1:Pila; VAR P2:Pila); VAR e:TipoElemento; BEGIN IF NOT EsVacia(P1) THEN BEGIN Cima(P1,e); Desapilar(P1); Apilar(P2,e); Invierte(P1,P2); Apilar(P1,e) END END;