You are on page 1of 6

APLICACIONES. Notacin Polaca y Polaca Inversa.

Notacin infija A+B C-D E*F G/H Con parntesis y orden

Distincin entre (A+B)*C y A+(B*C) de prelacin.

Notacin Polaca (Jan Lukasiewitz) (Notacin prefija) +AB CD *EF /GH Ejemplo: (A+B)*C A+(B*C) [+AB]*C A+[*BC] *+ABC +A*BC /+AB-CD

(A+B)/(C-D)

[+AB]/[-CD]

Notacin Polaca Inversa (Notacin Postfija). AB+ CDEF* GH/

Tampoco se necesitan parntesis. Un computador normalmente convierte la expresin infija en postfija y despus calcula la expresin. Ejemplo : Calculadora HP utiliza operaciones postfijas. Evaluacin 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 evaluacin: En el programa pondremos un valor centinela para saber cuando acaba la expresin. Por ejemplo un parntesis derecho. ALGORITMO: Encuentra el VALOR de una expresin aritmtica P escrita en notacin postfija. 1. 2. Aadir un parntesis 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.

3. 4.

5. 6. 7. 8.

5,6,2,+,*,12,4,/,Smbolo 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 notacin infija a postfija (O a Prefija en otros casos. ALGORITMO: POLACA(Q,P). Suponemos que Q es una expresin aritmtica escrita en notacin infija. Este algoritmo encuentra su expresin postfija P. 1.- Meter "(" en PILA y aadir ")" 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, aadirlo a P. 4.- Si se encuentra parntesis izquierdo, meterlo en PILA. 5.- Si se encuentra un operador entonces: (a) Repetidamente sacar de PILA y aadir a P cada operador (de la cima de PILA) que tenga la misma precedencia o mayor que . (b) Aadir a PILA. [FIN de condicional] 6.- Si se encuentra un parntesis derecho, entonces: (a) Repetidamente sacar de PILA y aadir a P cada operador (de la cima de PILA) hasta que se encuentre un parntesis izquierdo. (b) Eliminar el parntesis izquierdo (no aadir el parntesis izquierdo a P). [Fin de condicional] [Fin del Bucle del Paso 2] 7.- Salir.

EJEMPLO: A+(B*C-(D/Ef)*g)*H A+([BC*]-[DEF/]*G)*H A+([BC*]-[DEF/G*])*H A+[(BC*DEF/G*-H*)] ABC*DEF/G*-H*+

SMBOLO EXAM. A + ( B * C ( D / E F ) * G ) * H ) ( (+ (+( (+( (+(* (+(* (+((+(-( (+(-( (+(-(/ (+(-(/ (+(-(/ (+(-(/ (+((+(-* (+(-* (+ (+* (+*

PILA A A A AB AB ABC ABC* ABC*

EXPRESIN P

ABC*D ABC*D ABC*DE ABC*DE ABC*DEF ABC*DEF/ ABC*DEF/ ABC*DEF/G ABC*DEF/G*ABC*DEF/G*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 evala primero? -> (parntesis). - Dnde guardamos resultados intermedios? -> En pilas. El proceso a seguir es tener dos pilas, una para operandos y otra para operadores, para su realizacin es necesario que est bien parentizado, ya que, consiste en evaluar la expresin y si encontramos un parntesis 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 parntesis derecho, hay que realizar una operacin, cuyos operandos y operador se encuentran en las pilas, y as sucesivamente. Si la expresin no est realizada con parntesis hay que tener rdenes de prelacin y el algoritmo es un poco ms difcil (Ver Estructuras de Datos en JAVA de Weiss). Utilizamos pilas porque necesitamos albergar resultados intermedios pero no sabemos cuantos. La solucin 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 revs. 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;

You might also like