Вы находитесь на странице: 1из 15

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 Narciso Bermúdez
Murillo

UNAN-MANAGUA
Llamadas a subprogramas

Cuando se tiene un programa que llama a un subprograma, también conocido 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 (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 interrumpido (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
procedimientos recursivos (Castillo, 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 recursivas (Castillo, 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 original (Castillo, 2011).

Tratamiento de expresiones aritméticas

AB = Infija, AB = posfija, AB = Prefija

AB = Infija: Esta notación es Infija porque el operador se encuentra entre


los operadores.
AB = posfija: Esta notación es Posfija porque el operador se encuentra
después de los operadores.
AB = Prefija: Esta es una notación Prefija porque el operador se
encuentra antes de los operadores.

3
Evaluación de expresiones 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: 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.

Entrada Operación PILA Salida


‘a’ A la salida a
‘+’ Push ‘+’ a
‘b’ A la salida ‘+’ ab
‘*’ ->‘+’ < ‘*’ -> push ‘*’ ‘+’ ab
‘c’ a la salida ‘*’ ‘+’ abc
mientras precedencia
tope >= precedencia
‘+’ operador hacer pop ‘*’ ‘+’ a b c*+
≥ ‘+’ -> pop ‘+’ ≥ ‘+’ ->
pop
‘(’ -> push ‘(‘ ‘+’ abc*+
‘d’ a la salida ‘(‘ ‘+’ abc*+d
‘*’ -> ‘(‘ < ‘*’ ‘*’ ‘(‘ ‘+’ abc*+d
‘e’ a la salida ‘*’ ‘(‘ ‘+’ abc*+de
-> ‘*’ ≥ ‘+’ -> pop ‘*’ y
‘+’ ‘+’ ‘(‘ ‘+’ abc*+de*
push ‘+’
‘f’ a la salida ‘+’ ‘(‘ ‘+’ abc*+de*f
-> repetir pop hasta
‘)’ ‘+’ abc*+de*f+
encontrar ‘(‘
‘*’ Æ ‘+’ < ‘*’ ‘*’ ‘+’ abc*+de*f+
‘g’ A la salida ‘*’ ‘+’ abc*+de*f+g
EOF Vaciar pila abc*+de*f+g*+

5
Algoritmo conversión infija postfija (infija, 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 not eof hacer {Leer expresión 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 Escribir_f (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? (P, resp);
si resp = falso entonces
tope(P, top);
predecendia(top, prec2);
finsi
fin mientras;
finsi;
push (P, c); {Meto en la pila el operador que había 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? (P, resp);
mientras not resp hacer
pop(P, top);
Escribir_f (post, top);
vacía? (P, 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 a leer la expresión de derecha a izquierda.
Ejemplo:
(2+5)*8+7
Nuestra lectura en el recorrido quedaría así:
7+8*)5+2(

Se observa que la pila está vacío con el tope -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, los
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érmino -> Factor -> Constante (8) -> (+) -> Término -> Factor -> (() -> Expresión -
> ()) -> Fin

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 -> Factor -> Identif. (a3) -> (*) -> Factor -> Constante (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

Вам также может понравиться