Вы находитесь на странице: 1из 12

Instituto Tecnológico Superior

de Escarcega
Carrera:
Ingeniería en sistemas
Computacionales.
Prof.:
Ing. francisco salvador Ballina.
Tema:
algoritmo de conversión de notación
infija-posfija.
integrantes:
Isai Cuj Catzin.
Rolando Lopez Tzab.
Cindy Camara martinez.
Ramiro A. Magaña Rodriguez.
Conversión de notación
infija-posfija

• Tópicos selectos de
programación
EXPRESIONES
• Una expresión aritmética:
– Conjunto de operadores, variables y paréntesis. Ejemplo:
• A+B
• Esta forma de escribir las expresiones: NOTACION INFIJA
• El operador siempre va en medio de los operandos
• En una expresión, las operaciones se “ejecutan” en
un cierto orden
– A+B*C no es igual que (A+B)*C
– Cada operador tiene su nivel de precedencia, recordemos:
• Paréntesis : () Mayor prioridad
• Potencia : ^
• Multiplicación/división: *,/
• Suma/Resta : +,-* Menor Prioridad
A+B*C

NOTACIONES  Agrupar como establece la


precedencia
 A+(B*C)
• La notación infija es la mas popular  Convertir operación por
• No es la única forma, hay dos mas operación
– NOTACION PREFIJA(POLACA)  La de mayor precedencia
• +AB Aquí el operador va antes que los
primero
 A+(BC*)
operandos
 La que le sigue en
– NOTACION POSFIJA(POLACA INVERSA)
precedencia
• AB+ Aquí el operador va después que  A(BC*)+
los operandos (A+B)*
 Remover Paréntesis C
• No son nada difíciles, pero  Agrupar
 ABC*+como establece la
– Siempre tener en cuenta la precedencia precedencia
de los operadores  (A+B)*C
• Ejemplo. Pasar a postfija las siguientes  Convertir operación por
expresiones: operación
 La de mayor precedencia
primero
Ya no se necesitan  (AB+)*C
paréntesis  La que le sigue en
En postfija, el orden de
precedencia
los operadores es el
 (AB+)C*
verdadero orden de
ejecución  Remover Paréntesis
EVALUACION DE EXPRESIONES
POSFIJAS
• Dadas
– AB+C*
– ABC*+
– Evaluelas, cuando A = 3, B = 4 y C = 5
– La primera, resultado : 35
– La segunda, resultado: 23
• Que algoritmo siguió para evaluar estas
expresiones?
AB+C*
7C* ABC*+
A20+

A+B -> 7 B*C ->


20 ->
20+A
7*C -> 35
23
EVALUACION: ALGORITMO
Podría ser un una
• Con lo anterior, ya tenemos una idea depilaque
hacer
– Deberíamos poder “recordar” c/operando de la2 veces Pop
expresion
– Si encontramos un operador
• Los dos últimos operandos recordados son los usados y del
Push
“olvidados” resultado en
la pila
• El resultado de la operación, debe ser también “recordado”
– Así, hastaABC*+ C * B +A
que la expresión termine

C
B
C*B
A
EN PSEUDOCODIGO
Pila s;
PilaVacia(s);
while(no hayamos revisados toda la expresion)
{
simbolo = siguiente elemento
if(simbolo es un operando)
Push(s,simbolo);
else{
operando1 = Pop(s);
operando2 = Pop(s);
valor = resultado de operación simbolo
entre operando1 y operando2
Push(s,valor);
}
}
return(Pop(s));
CONVERSION DE INFIJA A
A es un
El operador de
mayor
operando, es precedencia es
POSFIJA
añadido
directamente a la
el primero en
aparecer en la
nueva expresión expresión
en postfija

El operador de mayor
precedencia en la expresión
A+B*C- será el primero en aparecer
ABC*+D-
D en la conversión

*Comparado
Es+ un
Pero
es aun
un con el continuar.
operador.
no podemos
operador, de
Si mayor
se
Aquí
prioridad terminamos
hastaelahora(elde revisar
el – con el *),
comparala
con
Seguimos comparando
pero, hasta
expresión, lo ultimo
que
símbolo
de
por
el prioridad
mayor
recordado, – no tiene hastamayor
el ahora, el +.
* tiene
vamos revisando,
símbolo.
Como el – no prioridad. no esque
tiene mayor prioridad
mayor prioridad. Pero
A B C*+ D elelde
Ahora
no
Ensi lapodemos
+, elmayor
+ ya
sabemos
pila,
puede
quedan
decir,aun
prioridad,
ser añadido
si
operadores. tiene
aque
la *
el *mejor,
es elComo guardarlo
operador de mas
mayor
-
expresion.
Todos
“la” mayor
ya no queda
seprioridad
sacan y
prioridad
pila,
se
en la
añaden +
-
de
El
a
todos
Podemos
– es
la nueva
aun.
añadir
definitivamente
expresión
Mejor
el *ahora,
hasta a la el
Así
denueva
termina
guardarlo
“mayor
la
expresion,
prioridad”,
conversión
y
debemos
“olvidarnos”
recordarlo de el
CONVERSION: ALGORITMO
• Cada símbolo de la expresión es revisado
• Si el símbolo es un operando,
– Se añade a la expresión
• Si el símbolo es un operador
– El símbolo es evaluado con respecto a su prioridad
– Si tiene mayor prioridad que el ultimo operador almacenado
• Aun no se puede decir nada, y se recuerda, es decir, se almacena en
un pila
– Si tiene menor prioridad que el ultimo operador almacenado
• Quiere decir, que el ultimo operador almacenado es el de mayor
prioridad sin lugar a dudas
• El ultimo operador almacenado, se saca y se añade a la nueva
expresión
• Esto sigue hasta que el operador que estamos revisando sea el de
mayor prioridad de todos los almacenados en la pila
• Una vez revisados todos los símbolos de la expresión
– Si hay algo almacenado en la pila, se saca y se añade a la nueva
expresión
EN PSEUDOCODIGO
Pila s;
PilaVacia(&s);
while(no termine la expresion en infija)
{
simbolo = siguiente carácter de entrada;
if(simbolo es un operando)
añadir simbolo a la nueva expresion posfija
else{
while(simbolo tenga menor o igual precedencia que el tope de la
pila)
{
simb_tope = pop(s);
añadir simb_tope a la nueva exp.
}
push(s,simbolo)
}
}
/*le da salida a los operadores restantes*/
while(!EstaVacia(s)){
simb_tope = pop(s);
añadir simb_tope a la nueva exp. posfija
}
Y CON PARENTESIS
• Lo anterior, es valido para conversión de
expresiones sin paréntesis
• Para resolver este problema, podemos
seguir las siguientes reglas:
– Los paréntesis izquierdos (
• Siempre van a ser añadidos a la pila, pase lo que
pase
– Los paréntesis derechos )
• Significa que un ambiente de () ha sido terminado,
• Todos los operadores de la pila, se sacan, hasta
encontrar un (
CON PARENTESIS: ALGORITMO
Pila s;
PilaVacia(s);
while(no termine la expresion en infija){
simbolo = siguiente carácter de entrada;
if(simbolo es un operando)
añadir simbolo a la nueva expresion posfija
else{
if(simbolo == ‘)’){
while(TRUE){
simb_tope = pop(s);
if (simb_tope == ‘)’ || EstaVacia(s)) break;
añadir simb_tope a la nueva exp.
}
}
else if(simbolo != ‘(‘){
while(simbolo tenga menor o igual precedencia que el tope de la pila)
simb_tope = pop(s);
añadir simb_tope a la nueva exp.
}
}
push(s,simbolo)
}
}
/*le da salida a los operadores restantes*/
while(!EstaVacia(s)){
simb_tope = pop(s);
añadir simb_tope a la nueva exp. posfija
}

Вам также может понравиться