02 tad pila - eafranco.com...(memoria estática) pila hablamos de una estructura de datos estática...
TRANSCRIPT
Estructuras de datos (Prof. Edgardo A. Franco)
1M. en C. Edgardo Adrián Franco Martínez http://[email protected]
@edfrancom edgardoadrianfrancom
Tema 02: TAD Pila
Contenido• Descripción del TAD Pila• Especificación del TAD Pila
• Cabecera• Definición• Operaciones• Observaciones
• Implementación del TAD Pila• Implementación estática• Implementación dinámica
• Aplicaciones del TAD Pila• Ejemplo 01: Problema Invertir una secuencia• Ejemplo 02: Problema validar paréntesis correctos
• Expresiones aritméticas• Expresiones infijas, prefijas y postfijas• Evaluación de expresiones infijas• Conversión de infijo a postfijo• Evaluación de expresiones postfijas
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
2
Descripción del TAD Pila
• Uno de los conceptos mas útiles en computación esla pila o stack.
• Es un conjunto de elementos, en la que:
• Los elementos se añaden y se remueven por un soloextremo.
• Este extremo es llamado “tope” de la pila.
• A las pilas se les llama también listas LIFO (last-infirst-out) o listas “ultimo en entrar, primero ensalir”.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
3
La ultima en llegar, sera la primera en
salir: LAST IN, FIRST OUT
LIFO
Cuando un empleado se va de vacaciones, le llega correo asu escritorio.▪ Las cartas se van “apilando”.
▪ Al regresar de vacaciones, la ultima carta en llegar, será la primeraque revisara
▪ Al terminar de revisarla, la nueva carta del tope de la pila habrácambiado
▪ Del “pilo” de cartas, la mas nueva que queda, será la siguiente en serrevisada
Descripción del TAD Pila (Ejemplo)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
4
Especificación del TAD Pila
Cabecera• Nombre: PILA (stack)
• Lista de operaciones:
• Inicializar pila (Initialize): Recibe una pila y la inicializa para sutrabajo normal.
• Empilar (Push): Recibe la pila y un elemento, e inserta este ultimoen el tope.
• Desempilar (Pop): Recibe la pila, y devuelve el elemento del tope.
• Es vacía (Empty): Recibe la pila y devuelve verdadero si esta estavacía.
• Tope pila (Top): Recibe la pila, y devuelve el elemento de la cima dela pila.
• Tamaño pila (Size): Recibe la pila, y devuelve el valor del tope.
• Eliminar pila (Destroy): Recibe una pila y la libera completamente.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
5
Definición• Dada una Pila llamada S
Push(s,elemento1)
Elemento 1
Tope o Cima
Push(s,elemento2)
Elemento 2
Push(S,elemento3)
Elemento 3
Pop(S)
EstaVacia? NoSi
▪ Al desempilar: ▪ Se “saca” elemento a elemento de la
pila: elemento = pop(s)
▪ La operación pop remueve el elemento del tope de la pila y lo retorna. La pila disminuye su tamaño.
▪ Al empilar: ▪ Cada elemento, es “colocado” a la pila:
push(S,elemento).
▪ La operación push aumenta un elemento a la pila, y esta aumenta en su tamaño
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
6
ERROR: Subdesbordamiento de la pila
• Elementos en la pila:
• A los elementos almacenados en la pila les correspondeuna posición según fueron insertados, y esta posición semantiene fija mientras se encuentren en la pila.
• El TAD pila mantiene su estructura:
• Lo único variante es la cantidad de elementos que seencuentran “empilados” según se lleven a cabo lasoperaciones de empilar y desempilar. (No mutable)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
7
Operaciones
• Inicializar pila (Initialize): recibe<- pila (S);
• Initialize(S);• Efecto: Recibe una pila y la inicializa para su trabajo normal.
• Empilar (Push): recibe<- pila (S); recibe<- elemento (e)
• Push(S,e);• Efecto: Recibe la pila y aumenta su tamaño, poniendo el elemento
en la cima de la pila.
• Desempilar (Pop): recibe<- pila (S); retorna -> elemento
• e=Pop(S);• Efecto: Recibe la pila, remueve el elemento tope y lo retorna.
• Excepción: Si la pila esta vacía, produce error.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
8
• Es vacía (Empty): recibe<- pila (S); retorna -> boolean
• b=Empty(S);• Efecto: Recibe una pila y devuelve true si esta vacía y false en caso
contrario.
• Tope pila (Top): recibe<- pila (S); retorna -> elemento
• e=Top(S);• Efecto: Devuelve el elemento cima de la pila.
• Excepción: Si la pila esta vacía produce error
• Tamaño pila (Size): recibe<- pila (S); retorna -> valor del tope
• n=Size(S);• Efecto: Devuelve el número de elementos que contiene la pila
(Altura de la pila).
• Eliminar pila (Destroy): recibe<- pila (S)
• Destroy(S);• Efecto: Recibe una pila y la libera completamente
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
9
Observaciones• El usuario de un pila debe remover hasta el ultimo elemento de
una pila verificando no caer en error.
• Una vez vacía, no se pueden “sacar o desempilar” mas elementos de la pila.
• Antes de sacar un elemento de la pila
• Debemos saber si la pila No esta vacía
• El tope de la pila siempre esta cambiando
• Deberíamos poder “revisar” el elemento tope de la pila.
• Si la pila esta vacía, el tamaño de la pila es 0
• El tratar de remover elementos o acceder a elementos de una pila vacía se llama
• Subdesbordamiento de la pila
• Al tratar de empilar elementos en una pila que ha llegado a su MAX_ELEMENT (Se supone que no deberá de tener fin, aunque en la
realidad no es posible) se le llama:
• Desbordamiento de la pila
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
10
Aplicaciones del TAD Pila• Las pilas se usan cuando para
• Recuperar un conjunto de elementos en orden inverso acomo se introdujeron
• Un programa debe
• Leer una secuencia de elementos enteros
• Luego mostrarlos en orden inverso al ingresado
• Ejemplo 01: Problema Invertir una secuencia
• Si se ingresa: 1, 3, 5, 7
• Se mostrara: 7, 5, 3, 1
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
11
Ejemplo 01: Solución
1357
135
131
7 5 3 1
▪ Una vez llenada la pila,▪ Solo hay que “sacar”, elemento
tras elemento
▪ Hasta que la pila quede vacía
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
12
Ejemplo 02: Problema validar paréntesis correctos
• El compilador siempre sabe cuando se ha escrito un paréntesis, o una llave de mas
• ¿Como lo hace?
• Con el uso de pilas, expresiones escritas:
• (a+b)) Mal
• ((a+b) * c / 4*g-h) OK
• Se puede reconocer los paréntesis que no coinciden
• ¿Como lograr esta aplicación de la pila?
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
13
• Cuando los paréntesis coinciden:• Al final de la expresión
• Total paréntesis izq = Total paréntesis der y
• En todo momento, en cualquier punto de la expresión
• Cada paréntesis der. esta precedido de uno izq
• Acum. paréntesis der. siempre es <= que Acum. paréntesis izq
• P.g.
7 - ((X* ((X+Y)/(J-3)) + Y) / (4-2.5))
(A+B)) + 3 Al final de la expresión:Total ( = 1Total ) = 2
En este punto de la expresión, ya se sabe que es incorrecta
Acum ( = 1Acum ) = 2
No se cumple la regla
Ejemplo 02: Problema
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
14
Todos los ), encontraron su (7 - ( ( X *( ( X+Y ) / ( J - 3) ) +Y ) / ( 4- 2) )
(
(
(
(
Ejemplo 02: Solución
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
15
Una expresión aritmética contiene constantes,variables y operaciones con distintos niveles deprecedencia.
Operaciones básicas:
^ potencia*/ multiplicación, división+,- suma, resta
Expresiones aritméticas
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
16
Notación infija:Los operadores aparecen en medio de los operandos.
A + B, A – 1, E/F, A * C , A ^ B , A + B + C, A+B-C
Notación prefijaEl operador aparece antes de los operandos.
+ AB, - A1, /EF, *AC, ^AB, +AB+C, +AB-C
Notación postfija:El operador aparece al final de los operandos.
AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-
Expresiones infijas, prefijas y postfijas
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
17
Pasos para evaluar una expresión:
1. Convertir a postfijo: convertir la expresión en notación infijo a notación postfijo. (Se emplea una pila)
2. Evaluar la expresión postfija: usar una pila para mantener los resultados intermedios cuando se evalúa la expresión en notación posfijo.
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
18
Pasos para convertir expresión infija a postfija
1. Se crea una cadena resultado donde se almacena la expresión enpostfijo.
2. Los operandos se agregan directamente al resultado
3. Un paréntesis izquierdo se mete a la pila y tiene prioridad oprecedencia cero (0).
4. Un paréntesis derecho saca los elementos de la pila y los agrega alresultado hasta sacar un paréntesis izquierdo.
5. Los operadores se insertan en la pila si:• La pila esta vacía.
• El operador en el tope de la pila tiene menor precedencia.
• Si el operador en el tope tiene mayor precedencia se saca y agrega al resultado(repetir esta operación hasta encontrar un operador con menor precedencia o la pilaeste vacía).
6. Cuando se termina de procesar la cadena que contiene la expresióninfijo se vacía la pila pasando los elementos al resultado.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
19
A + B * C - D A B C * + D -El operador de mayor
precedencia en la expresión será el primero en aparecer en la
conversión
A
El operador de mayor
precedencia es el primero en
aparecer en la expresión
A es un operando, es añadido
directamente a la nueva expresión en
postfija
+
+ es un operador, pero, hasta lo que vamos
revisando, no es el de mayor prioridad, mejor,
guardarlo
* Es un operador. Si se compara con el ultimo recordado, el * tiene
mayor prioridad. Pero no sabemos si tiene “la”
mayor prioridad de todos aun. Mejor guardarlo
*
Comparado con el de mayor prioridad hasta ahora(el *), el –
no tiene mayor prioridad.Ahora si podemos decir, que el *
es el operador de mayor prioridad
Podemos añadir el * a la nueva expresion, y “olvidarnos” de el
Pero aun no podemos continuar. Seguimos
comparando el – con el de mayor prioridad
hasta ahora, el +. Como el – no tiene mayor
prioridad que el +, el + ya puede ser añadido
a la expresion. Como ya no queda mas en la
pila,
El – es definitivamente hasta ahora, el de
“mayor prioridad”, debemos recordarlo
-
Aquí terminamos de revisar la expresión, símbolo por símbolo.
En la pila, quedan aun operadores.
Todos se sacan y se añaden a la nueva expresión
Así termina la conversión
B C *+ D -
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
20
Reglas para evaluar si se incluyen paréntesis
• Para resolver este problema, podemos seguir las siguientes
reglas:
• Los paréntesis izquierdos (
• Siempre van a ser añadidos a la pila, pase lo que pase
• Los paréntesis derechos )
• Significa que un ambiente de () ha sido terminado,
• Todos los operadores de la pila, se sacan, hasta encontrar un (
Conversión de infijo a postfijo
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
21
Reglas para evaluar una expresión postfijaRecorrer la expresión de izquierda a derecha
1. Si es un operando
• Almacenar el valor en la pila de valores
2. Si es un operador:
• Obtener dos operandos de la pila de valores
• Aplicar el operador
• Almacenar el resultado en la pila de valores
Al finalizar el recorrido, el resultado estará en la pila de valores
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
22
• Deberíamos poder “recordar” cada operando de la expresión y su cálculo
• Si encontramos un operador• Los dos últimos operandos recordados son los usados y “olvidados”
• El resultado de la operación, debe ser también “recordado”
• Así, hasta que la expresión termine
ABC*+ *CB+A
A
B
C
B*C
TAD Pila IV (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
23
Implementación del TAD Pila
• Hay varias formas…• Verlo como un arreglo… con operaciones especificas
• Un arreglo de datos el cuál se va llenando conforme serealizan inserciones y vaciando por el final del arreglo(índice Tope que lleve el control).
• Verlo como una una Lista… empleando solo algunas de susoperaciones posibles y restringiendo el resto.
• En la lista los nuevos nodos se pueden insertar y remover• Al/Del Inicio, al final, dada una posición, etc.
• En la Pila los elementos solo se pueden insertar al final de la Pila• Y solo se pueden remover del Final de la Pila
• Más adelante en el curso se notará queimplementaciones de la lista simplemente enlazadapodrían usarse para implementar una pila.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
24
Implementación estática
Montículo (Memoria libre)
Pila de ejecución
Código
Datos del main()(Memoria estática)
Pila
Hablamos de una Estructura dedatos estática cuando se le asignauna cantidad fija de memoria paraesa estructura antes de la ejecucióndel programa.▪ La cantidad de espacio asignado para la
memoria estática se determina durante lacompilación y no varía a la hora de ejecutarseel programa que la implemente.
TAD Pila II (Edgardo A. Franco)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
25Datos de Función
(Variables estáticas)
Implementación estática del TAD Pila
• La Pila seria un arreglo
• typededef struct { arreglo elementos; int tope} Pila;
• Y solo deberemos implementar las
operaciones de
• Push, sumando el índice tope e insertando en
subíndice tope del arreglo al elemento.
• Pop, devolviendo el elemento del subíndice
tope y restando el índice tope.
• Top, devolviendo el elemento del subíndice
tope.
MAX_ELEM
Tope = -1
Tope = 0
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
26
Pop(e1);
e1
0 1 2 3 4 5
TOPE: Apunta hacia el elemento que seencuentra en el extremo de la pila.(inicialmente es -1).
Usando arreglos: Define un arreglo de unadimensión (vector) donde se almacenan loselementos.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
27
TADPilaEst.h (Implementación estructurada en lenguaje C)
Tope =
MAX_ELEM-1
Tope = 0
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
28
//DEFINICIONES DE CONSTANTES
#define MAX_ELEMENT 1000
#define TRUE 1
#define FALSE 0
//DEFINICIONES DE TIPOS DE DATO
//Definir un boolean (Se modela con un "char")
typedef unsigned char boolean;
//Definir un elemento (Se modela con una estructura "elemento")
typedef struct elemento
{
//Variables de la estructura "elemento" (El usuario puede modificar)
char c;
//***
//***
//***
}elemento;
//Definir una pila (Se modela con una estructura que unicamente incluye un puntero a "elemento")
typedef struct pila
{
elemento arreglo[MAX_ELEMENT];//La pila es un arreglo estático de MAX_ELEMET
int tope; //El tope es un entero (Indice del arreglo de elementos)
}pila;
//DECLARACIÓN DE FUNCIONES
void Initialize(pila *s); //Inicializar pila (Iniciar una pila para su uso)
void Push(pila *s, elemento e);//Empilar (Introducir un elemento a la pila)
elemento Pop (pila *s); //Desempilar (Extraer un elemento de la pila)
boolean Empty(pila *s); //Vacia (Preguntar si la pila esta vacia)
elemento Top(pila *s); //Tope (Obtener el "elemento" del tope de la pila si extraerlo de la
pila)
int Size(pila *s); //Tamaño de la pila (Obtener el número de elementos en la pila)
void Destroy(pila *s); //Elimina pila (Borra a todos los elementos y a la pila de memoria)
Montículo (Memoria libre)
Pila de ejecución
Implementación dinámica
Código
Datos (Memoria estática)
Pila
Hablamos de una Estructura dedatos dinámica cuando se le asignamemoria a medida que esnecesitada, durante la ejecución delprograma.
▪ En este caso la memoria para laestructura de datos no queda fijadurante la compilación si no tiene uncomportamiento dinámico en laejecución.
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
29
Implementación dinámica del TAD Pila
• La implementación de una pila dinámica
obliga a que no sea necesario un
MAX_ELEMENT, si no que se logre
solicitar espacio durante la llamada a
empilar para almacenar el elemento y
liberar espacio durante la operación
desempilar elemento. En este caso el
tope a la región en memoria donde esta
el ultimo elemento.
DIN
ÁM
ICO
Tope = NULL
Tope =
MAX_MEMORIA
Tope = 0
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
30
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
31
TADPilaDin.h (Implementación estructurada en lenguaje C)
Tope =
MAX_ELEM-1
Tope = 0
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
32
//DEFINICIONES DE CONSTANTES
#define TRUE 1
#define FALSE 0
//DEFINICIONES DE TIPOS DE DATO
//Definir un boolean (Se modela con un "char")
typedef unsigned char boolean;
//Definir un elemento (Se modela con una estructura "elemento")
typedef struct elemento
{
//Variables de la estructura "elemento" (El usuario puede modificar)
char c;
//***
}elemento;
//Definir un nodo que será utilizado para almacenar una posición de la pila (Nodo), lo que
incluira a un elemento y a un apuntador al siguiente nodo
typedef struct nodo
{
elemento e; //Elemento a almacenar en cada nodo de la pila
struct nodo *abajo; //Apuntador al elemento de debajo
}nodo;
//Definir una pila (Se modela con una estructura que unicamente incluye un puntero a "elemento")
typedef struct pila
{
nodo *tope; //Apuntador al elemento en el tope de la pila
}pila;
//DECLARACIÓN DE FUNCIONES
void Initialize(pila *s); //Inicializar pila (Iniciar una pila para su uso)
void Push(pila *s, elemento e);//Empilar (Introducir un elemento a la pila)
elemento Pop (pila *s); //Desempilar (Extraer un elemento de la pila)
boolean Empty(pila *s); //Vacia (Preguntar si la pila esta vacia)
elemento Top(pila *s); //Tope (Obtener el "elemento" del tope de la pila si extraerlo de la
pila)
int Size(pila *s); //Tamaño de la pila (Obtener el número de elementos en la pila)
void Destroy(pila *s); //Elimina pila (Borra a todos los elementos y a la pila de memoria)
TADPila.h (Implementación estructurada en lenguaje C)
Tope = 0
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
33
ESPECIFICACIÓN
TADPilaEst.hDeclaración de
funciones
TADPilaEst.cDefinición de
funciones
#include"TADPilaEst.h"
push(){}
pop(){}
-Declaración de funciones (prototipos)
-Declaración de tipos de datos y estructuras-Definición de constantes
-Definición de las funciones (código)
-Usa tipos, estructuras y constantes
Uso del TADPila (En lenguaje C)
Estr
uct
ura
s d
e d
ato
s0
2 T
AD
Pila
Pro
f. Ed
gard
o A
dri
án F
ran
co M
artí
nez
34
main.c
#include"TADPila.h"
pila si;
elemento e1;e1=datos;push(si, e1)..
Compilar $gcc main.c TADPila.o -o programa (Compilación del main)
$gcc TADPila.c -c (Compilación de la librería)Se obtendrá: TADPila.o
$gcc main.c TADPilaEst.c -o prog (Compilación de la librería y el main si se tiene el .c de la pila)