Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Investigacion
Notaciones de Conversion
Lenguajes Automatas II
2143S6762
7 - Turno nocturno
Expresiones en notaciones infija, prefija y sufija
Aunque todo esto puede ser obvio para usted, recuerde que las computadoras
necesitan saber exactamente qué operadores deben ejecutarse y en qué orden. Una
forma de escribir una expresión que garantice que no habrá confusión con respecto al
orden de las operaciones es crear lo que se denomina expresión completamente
agrupada. Este tipo de expresión utiliza una pareja de paréntesis para cada operador.
Los paréntesis dictan el orden de las operaciones; no hay ambigüedad. Tampoco es
necesario recordar las reglas de precedencia.
Hay otros dos formatos de expresión muy importantes que, al principio, pueden no
parecer obvios. Considere la expresión infija A + B. ¿Qué pasaría si moviéramos el
operador antes de los dos operandos? La expresión resultante sería + A B. Del mismo
modo, podríamos mover el operador al final. Obtendríamos A B +. Estas expresiones
se ven un poco extrañas.
Estos cambios en la posición del operador con respecto a los operandos crean dos
nuevos formatos de expresión, la notación prefija y la notación sufija (o postfija). La
notación prefija requiere que todos los operadores precedan a los dos operandos sobre
los que actúan. La notación sufija, por otro lado, requiere que sus operadores
aparezcan después de los operandos correspondientes. Algunos ejemplos más
deberían ayudar a hacer esto un poco más claro.
(A + B) * C *+ABC AB+C*
(A + B) * (C + D) *+AB+CD AB+CD+*
Hasta el momento, hemos utilizado métodos ad hoc para convertir entre expresiones
infijas y las expresiones equivalentes en notaciones prefija y sufija. Como es de
esperar, hay formas algorítmicas para realizar la conversión que permiten transformar
correctamente cualquier expresión de cualquier complejidad.
A medida que procesamos la expresión, los operadores tienen que ser guardados en
alguna parte, ya que sus operandos derechos correspondientes no aparecen todavía.
También, el orden de estos operadores guardados puede necesitar ser invertido debido
a su precedencia. Ése es el caso con la adición y la multiplicación en este ejemplo.
Dado que el operador de adición aparece antes del operador de multiplicación y tiene
menor precedencia, necesita aparecer después de que se use el operador de
multiplicación. Debido a esta inversión del orden, tiene sentido considerar el uso de una
pila para almacenar a los operadores hasta que se necesiten.
Suponga que la expresión infija es una cadena de símbolos delimitados por espacios.
Los símbolos de operaciones son *, /, + y -, junto con los paréntesis izquierdo y
derecho, ( y ). Los símbolos de operandos son los identificadores de un solo carácter A,
B, C, y así sucesivamente. Los siguientes pasos producirán una cadena de símbolos
en el orden sufijo.
1. Crear una pila vacía llamada pilaOperadores para almacenar los operadores.
Crear una lista vacía para almacenar la salida.
2. Corvertir la cadena de entrada de notación infija a una lista, usando el método
split.
3. Recorrer la lista de símbolos de izquierda a derecha:
o Si el símbolo es un operando, agregarlo al final de la lista de salida.
o Si el símbolo es un paréntesis izquierdo, enviarlo a pilaOperadores.
o Si el símbolo es un paréntesis derecho, extraer de pilaOperadores hasta
que el correspondiente paréntesis izquierdo se haya extraído. Agregar
cada operador al final de la lista de salida.
o Si el símbolo es un operador *, /, +, ó -, incluirlo en pilaOperadores. No
obstante, extraer previamente de la pila los operadores que tengan mayor
o igual precedencia y agregarlos a la lista de salida.
4. Cuando la expresión de entrada ha sido procesada completamente, verificar
pilaOperadores. Todos los operadores que aún estén almacenados en ella se
deben enviar a la lista de salida.
Como ejemplo final sobre las pilas, consideraremos la evaluación de una expresión que
ya está en notación sufija. En este caso, una pila será de nuevo la estructura de datos
elegida. Sin embargo, al recorrer la expresión sufija, son los operandos los que deben
esperar, no los operadores como en el algoritmo de conversión anterior. Otra forma de
pensar en la solución es que siempre que se vea un operador en la entrada, se usarán
en la evaluación los dos operandos más recientes.
Para ver esto con más detalle, considere la expresión sufija 4 5 6 * +. Al recorrer la
expresión de izquierda a derecha, usted encuentra primero los operandos 4 y 5. En
este punto, usted todavía no está seguro respecto a qué hacer con ellos hasta que vea
el siguiente símbolo. Ubicando cada uno en la pila asegura que estén disponibles si un
operador viene a continuación.
En este caso, el símbolo siguiente es otro operando. Así pues, como antes, inclúyalo
en la pila y examine el símbolo siguiente. Ahora vemos un operador, *. Esto significa
que los dos operandos más recientes necesitan ser utilizados en una operación de
multiplicación. Al extraer dos veces de la pila, podemos obtener los operandos
adecuados y luego realizar la multiplicación (en este caso obtenemos 30 como
resultado).
Ahora podemos manejar este resultado colocándolo de nuevo en la pila para que
pueda ser utilizado como un operando para los operadores posteriores en la expresión.
Cuando se procesa el operador final, sólo quedará un valor en la pila. Se extrae y se
devuelve como el resultado de la expresión. La Figura 10 muestra el contenido de la
pila a medida que se procesa toda la expresión de ejemplo.
Figura 10: Contenido de la pila durante la evaluación