Informe de Pilas

March 2, 2023 | Author: Anonymous | Category: N/A
Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF