aplicaciones de las pilas

Upload: alvaro-garcia

Post on 14-Jul-2015

27 views

Category:

Documents


0 download

TRANSCRIPT

Aplicacin de Pilas

APLICACION DE LAS PILASEvaluacin de expresiones aritmticas (Calculadora sencilla)Sabemos que, para evitar ambigedad y saber en qu orden se deben evaluar las expresiones, se define en los lenguajes de programacin una prioridad para cada posible operador. Adems, si dos operadores tienen la misma prioridad se evita el conflicto evaluando stos de izquierda a derecha. Tambin est permitido el uso de parntesis para establecer un orden concreto de evaluacin, independientemente de la precedencia de los operadores. Todos estos condicionamientos son debidos al tipo de notacin empleada, llamada notacin infija, donde los operadores se sitan entre los operandos sobre los que acta. Considera la expresin en notacin infija x = 1+2*3 A qu es igual? Matemticamente, la expresin se evala a 7, porque el operador de multiplicacin tiene mayor precedencia (prioridad) que la suma, esto es, se evala primero. Sin embargo, aunque esto parezca simple, algunas calculadoras daran como respuesta 9 (respuesta equivocada) al evaluar la expresin como va de izquierda a derecha. La siguiente expresin a que sera igual? x = 4/2 3 + 7 *3 6*2 (en notacin infija)

Respetando la precedencia y asociatividad de los operadores, y poniendo parntesis para hacerla ms clara, se evaluara como sigue: x = (((4/2) 3) + (7 *3)) (6*2) = 8 El problema es: cmo genera el compilador el cdigo necesario para calcular esta expresin? La solucin se facilita si se modifica el tipo de notacin empleada para representar la expresin. Es conveniente pasar a notacin posfija, que proporciona un mecanismo directo evaluacin, en donde el operador se sita detrs de los operandos sobre los que acta. Las ventajas de la notacin posfija son varias: no hace falta parntesis, no hace falta definir prioridad de operadores y la evaluacin final de la expresin se realiza fcilmente con un simple recorrido de izquierda a derecha de la expresin. Siguiendo la notacin posfija, las expresiones anteriores se podra escribir como:

M.C. Yal Galicia Hdez. (FCC/BUAP)

1

Aplicacin de Pilas 123*+ 42/373*+62*Para realizar el clculo de las expresiones en notacin postfija, hay que tener en cuenta que al leerlas de izquierda a derecha, lo primero que se lee son los operandos y despus el operador. Por ello, es necesario almacenar la informacin leda hasta que se determine que operador hace uso de ella. Adems, los operadores actan sobre los ltimos operandos ledos. De manera que, conviene recuperar la informacin en sentido inverso a como se almacena. Por esa razn, parece natural emplear una pila como estructura de almacenamiento de informacin. El esquema algortmico para la evaluacin de expresiones dadas en notacin postfija consistir en ir analizando secuencialmente la expresin. Si se detecta un operando, se inserta en la pila y si se detecta un operador (+, -, /, *) , ste se evala utilizando los operandos necesarios de la pila (en el caso de operadores binarios, se desapilan dos operandos). El resultado se apila de nuevo en la pila, puesto que ser un operando para otro operador posterior. Cuando la expresin postfija completa ha sido procesada, el resultado debera ser el nico elemento en la pila. Este proceso es mucho ms simple que intentar la evaluacin directa a partir de la expresin en notacin infija.

Algoritmo para evaluar expresiones postfijasp: pila Inicio leer expresion mientras (hay elementos en la expresion) hacer si elemento = operando entonces p.apilar(elemento) sino //es un operador der = p.desapilar( ) // 1er. operando izq = p.desapilar() // 2do. operando aplicar operador sobre los operandos desapilados p.apilar(resultado) fin_sino fin_mientras res = p.desapilar() //desapilar resultado escribir res Fin

Como ejemplo, consideremos la expresin postfija: 123*+ La evaluacin procede de la siguiente manera: el 1, el 2 y el 3 son apilados, en ese orden, en la pila.

M.C. Yal Galicia Hdez. (FCC/BUAP)

2

Aplicacin de Pilas

3 2 1 Para procesar el * , se desapilan los dos elementos superiores de la pila: esto es, el 3 y despus el 2. Observa que el primer elemento desapilado se convierte en el operando derecho del operador, y el segundo en el izquierdo; por tanto, los parmetros se obtienen de la pila en orden inverso al natural. Para la multiplicacin esto no importa, pero para la resta y la divisin desde luego que s. El resultado de la multiplicacin es 6, y es apilado en la pila.

6 1 En este momento el tope de la pila es 6; y debajo hay un 1. Para procesar el +, se desapilan el 6 y el 1, y su suma, 7 se apila.

7 En este punto, la expresin se ha ledo completamente y la pila tiene slo un elemento. Por tanto, la respuesta es 7.

Conversin de notacin infija a postfijaToda expresin infija vlida puede convertirse a notacin postfija, pero Cmo pasar de la notacin infija (que es cmoda y habitual para el usuario) a la notacin postfija, ms conveniente para automatizar los procesos de clculo?. Para realizar este proceso, de nuevo resulta adecuada la utilizacin de una pila. Para el proceso de traduccin de la expresin hay que tener en cuenta una serie de aspectos: los operandos aparecen en el mismo orden en la notacin infija y en la posfija, con lo que no hay que realizar ningn tipo de accin especfica cuando, al leer la expresin, se detecta un operando, simplemente proporcionarlo como salida; los operadores, por su parte, s que cambian de posicin al cambiar de notacin. En la notacin infija, el operador se sita antes que uno de los operandos, mientras que en la notacin posfija siempre va detrs. Por esa razn, ahora es conveniente almacenar los operadores, no los operandos, hasta el momento en que halla que proporcionarlos como salida. Adems, hay que tener en cuenta que la entrada de datos es una expresin en la que los operadores tienen asignadas distintas prioridades, estas prioridades tambin se deben tener en cuenta en el momento de la traduccin.

M.C. Yal Galicia Hdez. (FCC/BUAP)

3

Aplicacin de Pilas

Cuando se encuentra un operador en la entrada, los operadores de mayor prioridad (u operadores que asocien por la izquierda de la misma prioridad) se eliminan de la pila, lo que significa que deben ser aplicados. Tras ellos aplicamos el operador ledo de la entrada. El siguiente algoritmo permite traducir una expresin escrita en notacin infija a notacin postfija. Para simplificar la tarea, se ha supuesto que la expresin de entrada no tiene parntesis (lo que complicara ligeramente el proceso) y que tenemos definidas algunas funciones. Algoritmo Infija_Posfija Entrada expresion: cadena en notacin infija (ej: 9/3*5-2) Salida Expresin postfija: 93/5*2sig_elemento( ) //obtiene siguiente elemento salida() //enviar al arreglo de salida Variables x, y: caracteres fin : (cierto, falso) P : Pila Inicio P