Informe de Pilas
March 2, 2023 | Author: Anonymous | Category: N/A
Short Description
Download Informe de Pilas...
Description
UNIVERSIDAD NACIONAL AUTONOMA DE NICARAGUA. Departamento de Computación.
8-10-2019
Algoritmo y estructuras de datos Pilas Amparo Herrera Garcia
Ner Avidan Aguilar Vareas Omar Narc Narciso iso Bermúd Bermúdez ez Murillo UNAN-MANAGUA
Llamadas a subprogramas
Cuando se tiene un programa que llama a un subprograma, también conocido cono cido como modulo o función, internamente se usan pilas para guardar el estado de las variables del programa, así como instrucciones pendientes de ejecución en el momento que se hace la llamada llamada (Lopez (Lopez,, 2011). Cuando termina la ejecución del subprograma, los valores almacenados en la pila se recuperan para continuar con la ejecución del programa en el punto en el cual fue interrumpi interrumpido do (Lopez (Lopez,, 2011). Además de las variables se recupera la dirección del programa en la que se hizo la llamada, porque a esa posición se regresa el control del proceso. Grafico
Se guarda la posición en la que se hizo la llamada. Al terminar UNO, el control se regresa a PP recuperando previamente la dirección de la pila
1
Grafico
Recursividad e Iteración
La recursividad es posible gracias a la existencia de pilas ya que se usan comúnmente para indicar en qué punto se encuentra un programa cuando contiene procedimientos que se llaman a sí mismos. Estos procedimientos se conocen como procedimiento procedi mientoss recursivos (Casti (Castillo, llo, 2011). Las soluciones recursivas suelen ser bastante cortas pero cubren mucho más espacio en la memoria del ordenador, este es el principal inconveniente de las soluciones solucio nes recursivas recursivas (Casti (Castillo, llo, 2011). La técnica se basa en que un procedimiento o función que se hace llamadas a sí mismo en el proceso de realización de sus tareas. La recursividad se puede definir mediante un clásico ejemplo de la función factorial.
2
Grafico
Además es considerada una técnica muy potente que puede ser usada en lugar de una iteración (bucles o ciclos), ello implica una forma diferente de ver las acciones repetitivas permitiendo que un subprograma se llame para resolver una operación más pequeña del programa programa original (Casti (Castillo, llo, 2011).
Tratamiento de expresiones aritméticas A +B
= Infija Infija,, AB+ = posfija, + AB
= Prefij Pref ija a
A B = Infija: Esta notación es Infija porque el operador se encuentra entre
los operadores. AB
= posfi ja: Esta notación es Posfija porque el operador se encuentra
después de los operadores. operadores. AB
=
Pref Prefijija: a: Esta es una notación Prefija porque el operador se
encuentraa ante encuentr antess de los operador operadores. es.
3
Evaluación Evalua ción de expr expresion esiones es postfijas
Se lee la expresión elemento a elemento
Si es un operando se mete en una pilla
Si es un p} operador, se extraen los dos últimos elementos introducidos en la pila, se aplica el operador sobre ellos y el resultado se guarda la pila Grafico
Conversión de notación infija a postfija
El caso anterior resulta de utilidad si se dispone de una operación que obtenga la notación postfija a partir de una operación infija. Ejemplo: Ejempl o: a + b * c + (d * e + f) * g Î a b c * + d e * f + g * + Usando una pila este proceso puede realizarse de la siguiente forma: 1. Leyendo uno por uno los elementos de la entrada y si a) es un operando, se manda a la salida; b) es un “(“ Æ push (P, “(“ ) c) es un “)” Æ hacer pop (P, t) hasta que se encuentre “)” d) es un operador op, entonces d.1) sacar de la pila, pop (P, t), los operadores con prioridad mayor o igual a op: de menor a mayor: •( • +,• *, / d.2) push (P, op)
4
2. Cuando se llega al final de la entrada, se vacía la pila P sobre la salida. Ejemplo: Entrada = a + b * c + (d * e + f) * g En el siguiente ejemplo el tope de la pila es el elemento más a la izquierda. En t r ad a
Op er ac i ó n
PIL A
Sal i d a
a’’ ‘‘+ ‘b’ ‘*’ ‘c’
A laPussahlida A la salida ->‘+’ < ‘*’ -> push a la salida mientras precedencia tope >= precedencia operador hacer pop ‘*’ ‘+’ -> pop pop ‘+’ ‘+’ ‘+’ -> pop -> push a la salida -> ‘(‘ < ‘*’ a la salida -> ‘*’ ‘*’ ‘+’ ‘+’ -> pop ‘*’ ‘*’ y push ‘+’ a la salida -> repetir pop hasta encontrar ‘(‘ Æ ‘+’ < ‘*’ A la salida Vaciar pila
‘+’ ‘+’ ‘*’ ‘+’ ‘*’ ‘+’
aa ab ab abc
‘+’
a b c*+
‘(‘ ‘+’ ‘(‘ ‘+’ ‘*’ ‘(‘ ‘+’ ‘*’ ‘(‘ ‘+’
abc*+ abc*+d abc*+d abc*+de
‘+’ ‘(‘ ‘+’
abc*+de*
‘+’ ‘(‘ ‘+’
abc*+de*f
‘+’ ‘(’ ‘d’ ‘*’ ‘e’ ‘+’ ‘f’ ‘)’ ‘*’ ‘g’ EOF
‘+’
abc*+de*f+
‘*’ ‘+’ ‘*’ ‘+’
abc*+de*f+ abc*+de*f+g abc*+de*f+g*+
5
Algoritmo Algori tmo conversión conversión infij infija a postf postfija ija (infija, (infija, postfija) postfija) es
infija, postfija: cadena; {nombre de los ficheros} inf, post: fichero de carácter; c, top: carácter; prec1, prec2: entero; P: pila; eof, resp: lógico; INICIO Abrir_f (inf, infija, “l”); Abrir_f (post, postfija, “e”); Fin_f (inf, eof); mientras mientr as not eof hacer {Leer expresión expresión infija} infija} Leer_f(inf, c); es_operando? (c, resp); si resp = cierto entonces {Se manda directamente a la salida} Escribir_f (post, c); sino {es un operador} según (c) hacer ‘(‘: push(P, c); ‘)’: repetir pop (P, top); si top ‘(’ entonces entonces Escribir_f Escribir_f (post, (post, top); finsi; hasta que top = ‘(’; otros: {operador distinto de los paréntesis} {Sacar operadores con mayor precedencia} vacía? (P, resp); si resp = falso entonces tope (P, top); 6
precedencia(c, prec1); precedencia(tope, prec2); mientras prec2 >= prec1 AND not resp hacer pop(P, top); Escribir_f (post, top); vacía? vac ía? (P, resp) resp);; si resp = falso entonces tope(P, top); predecendia(top, prec2); finsi fin mientras; finsi; push (P, c); {Meto {Meto en la pila el operador operador que había leído} leído} fin según; finsi Fin_f (inf, eof); fin mientras; Cerrar_f (inf); {Se ha terminado la entrada} {Resta vaciar la pila de operadores} vacía? vac ía? (P, resp) resp);; mientras not resp hacer pop(P, top); Escribir_f (post, top); vacía? vac ía? (P, resp) resp);; fin mientras; Cerrar_f(post); FIN
7
Conversión de notación infija a prefija.
Primero invertimos el modo de lectura, en lugar de leerlo a de izquierda a derecha procederemos proceder emos a leer la expresi expresión ón de derecha a izqui izquierda. erda. Ejemplo: (2+5)*8+7 Nuestra lectura en el recorrido quedaría así: 7+8*)5+2(
Se observ observaa que la pi pila la est estáá vac vacío ío ccon on el top topee -1.
En esta caso como el 7 es un operando se almacena en el arreglo prefija
8
Incrementamos el contador a la segunda posición
Y continuamos con el resto de las posiciones.
Tenemos un operador de orden superior y de cierre, por tanto vaciamos la pila., por tanto vaciamos la pila.
9
Almacenamos los operadores +,*,+ en el arreglo Como ya hemos realizado todo el recorrido y tenemos elementos en la pila, llos os vamos a vaciar
10
Validación de una expresión aritmética
Como se observará en estos diagramas (también llamados diagramas de Conway) son grafos dirigidos que tienen dos componentes esenciales: El ‘rectángulo’ que indica que en ese punto hay un elemento del vocabulario que es no-terminal, es decir que tendrá otro diagrama de Conway para definirle. El ‘círculo’ para indicar que en ese punto hay un símbolo terminal, es decir que es un elemento perteneciente al vocabulario para la formación de expresiones aritméticas. En estos diagramas se acostumbrará a comenzar el recorrido por la izquierda, por la rama que suele llevar muy cercano el nombre del elemento que vamos a definir, se sigue el recorrido, en el sentido de las flechas, y cada elemento (rectángulo o círculo) que se va encontrando se concatena a lo que ya se tuviera. Quedan por definir Identf., Constante y Función: 11
Identif. : los identificadores se utilizarán para designar las variables que aparezcan en la expresión aritmética. Un identificador se formará empezando siempre por una letra seguida de 0 o más letras o dígitos numéricos.
Constante: una constante es, simplemente, un número real (notación IEEE 754-1985) compuesto por una parte entera, una parte decimal y una parte exponencial.
Función: se refiere a funciones matemáticas de un único parámetro. Las incluidas en este caso son:
Sqrt : calcula la raíz cuadrada de un número (positivo).
Exp : eleva el número e a un número.
Log : calcula el logaritmo neperiano de un número.
12
Ejemplo de validación de una expresión aritmética
8 + (a3 * 5) Términ inoo -> Fa Fact ctor or -> (() -> Ex Expr pres esió iónn Término -> F Término Fact actor or -> C Const onstant antee (8) -> (+) -> Térm Finn > ()) -> Fi Hasta aquí, tenemos reconocido, según los diagramas sintácticos, lo siguiente: 8 + (Expresión)
Aquí, Expresión se encargará de validar a3 * 5, con la siguiente secuencia: Término Térm ino -> F Fact actor or -> IIdent dentifif.. (a3) -> (*) -> F Fact actor or -> C Cons onsta tant ntee (5)
Ejemplos, igualmente válidos, que se pueden verificar con los diagramas sintácticos, serían:
1.
2 + 3^ (-3) * sqrt(79 / exp(1*a)) * (-5)
2.
(-(-(-(-(-8)))))
13
Bibliografía
https://www.academia.edu/25511949/UNIVERSIDAD_ESTATAL_DE_GUAYAQUIL_FACU LTAD_DE_CIENCIAS_MATEM%C3%81TICAS_Y_F%C3%8DSICAS_INGENIERIA_EN_SI STEMAS_COMPUTACIONALES_ESTRUCTURA_DE_DATOS_INVESTIGACION_APLICA CIONES_DE_PILAS_Y_COLAS_ESTUDIANTE?auto=download
https://www.infor.uva.es/~belar/Ampliacion/TDAS/Utilidades_TDA_PILA.pdf
https://runestone.academy/runestone/static/pythoned/Recursion/MarcosDePilaImplementac ionDeLaRecursividad.html
https://thales.cica.es/rd/Recursos/rd99/ed99-0636-03/expresion_arit.html
14
View more...
Comments