You are on page 1of 6

APLICACIONES.

Notacin Polaca y Polaca Inversa.


Notacin infija

A+B C-D E*F G/H

Distincin entre (A+B)*C y A+(B*C)


de prelacin.

Con parntesis y orden

Notacin Polaca (Jan Lukasiewitz) (Notacin 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
Notacin Polaca Inversa (Notacin Postfija).
AB+

CD-

EF*

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.

3.
4.

5.
6.
7.
8.

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.

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.

PILA

EXPRESIN P

(+

(+(

(+(

AB

(+(*

AB

(+(*

ABC

(+(-

ABC*

(+(-(

ABC*

(+(-(

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