Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Aplicaciones de Las Pilas
Aplicaciones de Las Pilas
Estructuras de Datos
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
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));
EJERCICIO EN CLASE
Dada la siguiente expresión:
6 2 3+ - 3 8 2 / + * 2 ^ 3 +
Simule la pila, para evaluar esta expresión
El operador de
CONVERSION DE INFIJA A
A es un operando,
es añadido
directamente a la
mayor
precedencia es el
primero en
POSFIJA
nueva expresión en
postfija
aparecer en la
expresión
El operador de mayor
A+B*C-D precedencia en la expresión
será el primero en aparecer en
ABC*+D-
la conversión
Comparado
*Pero
Es concontinuar.
el de mayor
+ esaunun
Aquí unno operador.
podemos
operador,
terminamos
Si
de
se
Seguimos
pero,
revisar
prioridad
compara
comparando hasta
– con ahora(el
el con el
el mayor *),
deultimo el –la
prioridad
hasta
expresión,
hastano tiene
ahora,
lo quesímbolo
el +.mayor
vamospor símbolo.
Como elprioridad.
– no tiene mayor
recordado,
revisando, el * tiene
el +, elno esdecir,
el de
Ahora
prioridad
En
que
la pila,
si podemos + ya
quedan
puede
aun
serque el
añadido
mayor prioridad. Pero no
A B C *+ D - mayor
a la*expresion.
sabemos
Todos se
operadores.
prioridad,
es el operador
Como ya no de
si
sacan tiene y
mejor,
se
mayor
queda
“la”
mas en la
añaden a la
*
guardarlo
prioridad
mayor
Podemos prioridad
nueva
pila,
de
añadir expresión
El – es definitivamente * atodos
elhasta la nueva
ahora, el de
+
-
aun. Así
expresion, termina
“mayor Mejor
prioridad”,
la
guardarlo
y “olvidarnos”conversión
debemos recordarlode 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
}
EJERCICIO EN CLASE
Usando el algoritmo, convertir
((A-(B+C))*D^(E+F)
ABC+-D*EF+^