Está en la página 1de 36

TEMA 2.

PILAS

Programacin II

1 Grao EI

ndice
1. 2. 3. 4. Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Implementaciones del TAD Pila
1. 2. 3. 4. Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

5. Ejemplos de uso 6. Evaluacin de expresiones aritmticas


1. Notaciones prefija y postfija 2. Algoritmo evaluacin expresin aritmtica

7. Eliminacin de recursividad
Programacin II 1 Grao EI 2

ndice
1. 2. 3. 4. Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Implementaciones del TAD Pila
1. 2. 3. 4. Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

5. Ejemplos de uso 6. Evaluacin de expresiones aritmticas


1. Notaciones prefija y postfija 2. Algoritmo evaluacin expresin aritmtica

7. Eliminacin de recursividad
Programacin II 1 Grao EI 3

1. Descripcin del TAD Pila



Una pila es un caso especial de secuencia enlazada:

Se inserta y se suprime por un extremo: tope o cima


Listas LIFO (last-in first-out) Listas ltimo en entrar, primero en salir Un montn de libros, una pila de platos, una pila de latas en la estantera de un supermercado. Llamadas a subprogramas Recursividad Tratamiento de expresiones aritmticas Ordenacin rpida (quicksort)

A las pilas se les llama tambin:


Ejemplos: Ejemplos de computacin:

Programacin II

1 Grao EI

1. Descripcin del TAD Pila


Ejemplos de computacin:
Llamadas a subprogramas:
Permiten guardar la direccin del programa (o subprograma) donde se hizo la llamada a otros subprogramas, para regresar posteriormente y seguir ejecutndolo a partir de la instruccin inmediata a la llamada. Permiten guardar el estado de las variables en el momento en que se hace la llamada, para recuperarlo al regresar del subprograma. Eliminacin de llamadas recursivas Conversin de expresiones de notacin infija a postfija/prefija Aumento de velocidad/eficiencia usando pilas para eliminar la recursividad

Recursividad

Tratamiento de expresiones aritmticas Ordenacin rpida (quicksort)

Programacin II

1 Grao EI

1. Descripcin del TAD Pila


Operaciones del TAD Pila:
PILAVACIA. Crea una pila vaca ESVACA. Devuelve un valor cierto si la pila est vaca, y falso en caso contrario. CIMA. Devuelve el elemento situado en el tope de la pila, sin extraerlo. PUSH (APILA). Aade un elemento a la pila, quedando ste situado en el tope. POP (DESAPILA). Suprime el elemento situado en el tope de la pila.

No se han definido operaciones de posicionamiento:


Todas las operaciones se hacen en el tope o cima.

Programacin II

1 Grao EI

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Ejemplos de uso Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 7

2. Especificacin del TAD Pila


Especificacin informal del TAD Pila pila=TAD con operaciones PilaVacia, esVacia, cima, push, pop. DESCRIPCIN:
Los valores del TAD pila son pilas de elementos del tipo tipoelem. Las pilas son mutables: push y pop aaden y eliminan elementos de la pila, respectivamente.

OPERACIONES: PilaVacia() devuelve (pila)


efecto: devuelve la pila vaca.

esVacia(P:pila) devuelve (booleano) efecto: Devuelve cierto si P es la pila vaca, y falso en caso
contrario.
Programacin II 1 Grao EI 8

2. Especificacin del TAD Pila


cima(P:pila) devuelve (tipoelem) requerimientos: La pila P es no vaca.
efecto: Devuelve el elemento situado en el tope de la pila

P.

push(P:pila; E:tipolem) modifica: P.


efecto: Aade el elemento situado en el tope.

E a la pila P, quedando ste

pop(P:pila)
requerimientos: La pila modifica:

P es no vaca. P.
9

P.

efecto: Suprime el elemento situado en el tope de la pila


Programacin II 1 Grao EI

2. Especificacin del TAD Pila


Especificacin formal del TAD Pila Tipo: pila(tipoelem) Sintaxis: *PilaVacia pila esVacia(pila)booleano cima(pila)tipoelem *push(pila,tipoelem)pila pop(pila)pila Semntica: Ppila, Etipoelem: esVacia(PilaVacia) cierto esVacia(push(P,E)) falso cima(PilaVacia) error cima(push(P,E)) E pop(PilaVacia) error pop(push(P,E)) P
Programacin II 1 Grao EI 10

2. Especificacin del TAD Pila


Mdulo de definicin del TAD Pila (pila.h) (sin tratamiento de errores) typedef int TELEMENTO ; /* tipo de datos correspondiente a los elementos de la pila */ typedef void * TPILA; void PilaVacia (TPILA *p); void Push (TPILA * p , TELEMENTO e); int EsVacia (TPILA p ); void Cima (TPILA p, TELEMENTO * pe); void Pop(TPILA * p);
Programacin II 1 Grao EI 11

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Ejemplos de uso Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 12

3. Simulacin Simulacin de una pila.


http://www.cosc.canterbury.ac.nz/people/mukundan/dsal/StackAppl.html

Programacin II

1 Grao EI

13

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Ejemplos de uso Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 14

4. Implementaciones del TAD Pila


Implementaciones alternativas para el TAD Pila:
Utilizar el TAD Lista (despus del tema de listas) Representacin contigua (vectores) Representacin con simple enlace (punteros)

Programacin II

1 Grao EI

15

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Ejemplos de uso Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 16

4.2. Implementacin con vectores


Operaciones:
push: incrementa tope y escribe el elemento en esa nueva posicin. pop: Decrementa tope
ARRAYS Se accede a cualquiera de sus elementos Estructura con una dimensin fija PILAS Slo se puede acceder al elemento cima de la pila. Estructura sin lmite de elementos

max_long . . .

tope 3 2 1 Programacin II

a3 a2 a1 1 Grao EI 17

4.2. Implementacin con arrays


Registro con dos campos:
Vector de elementos ndice del vector donde se encuentra el tope

Mdulo de implementacin (.c) /* nm. mx de elementos que podr almacenar #define MAX 100
la pila */

typedef

de la pila */

int

TELEMENTO ; /* tipo de datos correspondiente a los elementos

typedef struct { TELEMENTO arrayelementos[MAX]; int cima; } STPILA ; typedef STPILA* TPILA; /* concretamos el tipo abstracto */

Programacin II

1 Grao EI

18

4.2. Implementacin con arrays


void PilaVacia (TPILA *p) { *p = (TPILA) malloc(sizeof(STPILA)); (*p)->cima = -1; /*Valor asignado por nosotros para indicar que la pila est vaca. */ } int EsLlena (TPILA p) { if (p->cima == MAX-1) return 1; else return 0; }
Programacin II 1 Grao EI 19

4.2. Implementacin con arrays


int EsVacia (TPILA p ) { if (p->cima == -1) return 1; else return 0; } void Push (TPILA *p, TELEMENTO e) { int resp = EsLlena(*p); if (resp == 1) printf("ERROR, la pila est llena\n"); else { (*p)->cima++; (*p)->arrayelementos[(*p)->cima] = e ; }
Programacin II 1 Grao EI

20

4.2. Implementacin con arrays


void Cima (TPILA p, TELEMENTO * pe) { int respuesta = EsVacia(p); if (respuesta==1) printf("ERROR, la pila no tiene elementos\n"); else *pe = p->arrayelementos [p->cima]; } void Pop (TPILA *p) { int respuesta = EsVacia(*p); if (respuesta == 1) printf("ERROR, la pila no tiene elementos\n"); else (*p)->cima = (*p)->cima - 1; }
Programacin II 1 Grao EI 21

5.2. Implementacin con vectores


Ejemplo TPILA P;
PilaVacia(&P) P->cima -1 push (&P, E1) P->cima 0 E1 push (&P,E2) P->cima 1 E2 E1

P->arrayelementos

P->arrayelementos

P->arrayelementos

push(&P,E3)

pop (&P)

push (&P,E4)

P->cima 2 E3 E2 E1
P->arrayelementos

P->cima 1 E3 E2 E1
P->arrayelementos

P->cima

2 E4 E2 E1
P->arrayelementos

Programacin II

1 Grao EI

22

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Ejemplos de uso Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 23

4.3. Implementacin con punteros


PILA Slo se puede acceder al elemento cima de la pila. ESTRUCTURA DINMICA El puntero slo acceder a la posicin de memoria de la estructura dinmica que acte de TOPE de la pila. Por tanto, identificaremos PILA con un PUNTERO. La estructura dinmica se formar con elementos de tipo registro (NODOS) con los siguientes campos:
Valor del elemento de la pila Puntero con la direccin de memoria del siguiente nodo de la pila.

Es una estructura ordenada

Elemento de la pila

Puntero al siguiente nodo P pila tope E8 E7 ... E1

E8 E7 ... E1

tope

Implementacin mediante variables dinmicas

Tipo abstracto

Programacin II

1 Grao EI

24

4.3. Implementacin con punteros Simulacin:

http://www.cosc.canterbury.ac.nz/people/mukun dan/dsal/LinkStackAppl.html

Programacin II

1 Grao EI

25

4.3. Implementacin con punteros


Representacin con simple enlace: typedef int TELEMENTO ;
/* tipo de datos correspondiente a los elementos de la pila */

typedef struct nodo { TELEMENTO dato; struct nodo * sig; } TNodo; typedef TNodo * TPILA;

dato Elemento de la pila

sig

TNodo

Puntero al siguiente nodo

Estructura pila: Puntero externo al tope, pues es donde se realizan las operaciones de insercin/eliminacin. La primera celda es el tope.

Programacin II

1 Grao EI

26

4.3. Implementacin con punteros


void PilaVacia (TPILA *p) { *p = NULL; /*Valor NULO en un puntero, para indicar que
la pila est vaca. */

}
int EsVacia (TPILA p ) { if (p == NULL) return 1; else return 0; }

Programacin II

1 Grao EI

27

4.3. Implementacin con punteros


void Push(TPILA * p , TELEMENTO e) { TPILA q; q= (TPILA) malloc (sizeof(TNodo)); q->dato = e ; q->sig = *p ; *p = q; } void Cima (TPILA p, TELEMENTO * pe) { int respuesta = EsVacia(p); if (respuesta == 1) printf ("ERROR, la pila no tiene elementos\n"); else *pe = p->dato; }

Programacin II

1 Grao EI

28

4.3. Implementacin con punteros


void Pop(TPILA * p) { TPILA q; int respuesta; respuesta = EsVacia(*p); if (respuesta==1) printf("ERROR, ....\n"); else { q = *p; *p = (*p)->sig; free(q); } }
Programacin II 1 Grao EI 29

4.3. Implementacin con punteros


Con implementacin con memoria dinmica sera oportuno definir una funcin destruye que en un determinado momento permita liberar toda la memoria ocupada por la pila. Ejercicio: completar la implementacin para incluir esta operacin destruye. Tiene sentido esta funcin con memoria esttica?

Programacin II

1 Grao EI

30

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Ejemplos de uso Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 31

4.4. Comparacin de las implementaciones Longitud estimada de la pila:


Conocida arrays No conocida basada en punteros

Tamao de los elementos de la pila:


Pequeo arrays Grande basada en punteros

Frecuencia de utilizacin de las operaciones:


Crear y destruir pilas arrays Insercin/eliminacin punteros Recorridos arrays
Programacin II 1 Grao EI 32

ndice
Descripcin del TAD Pila Especificacin del TAD Pila Simulacin Ejemplos de uso Implementaciones del TAD Pila
Implementacin Implementacin Implementacin Comparacin de basada en el TAD Lista con vectores con punteros las implementaciones

Evaluacin de expresiones aritmticas


Notaciones prefija y postfija Algoritmo evaluacin expresin aritmtica

Eliminacin de recursividad
Programacin II 1 Grao EI 33

5. Ejemplos de uso
Ejemplos de operaciones simples sobre pilas Creacin de una pila de un nmero determinado de elementos Impresin de los elementos de una pila Supondremos que las pilas estn formadas por elementos de tipo int, es decir, typedef int tipoelem, en pila.h

Programacin II

1 Grao EI

34

5. Ejemplos de uso
Creacin de una pila de un n determinado de elementos

void leer(TPILA *P, short N) { TELEMENTO e; short i; PilaVacia(P); for (i=1 ; i<=N ; i++) { printf(Dime un entero:); scanf(%d, &e); push(P,e); } }

Programacin II

1 Grao EI

35

5. Ejemplos de uso
Impresin de los elementos de una pila void imprimir (TPILA *pila) { TPILA aux; TELEMENTO E; PilaVacia(&aux); /*Vaco P en aux*/ while (esVacia(*pila) == 0 ){ cima(*pila,&E); pop(pila); push(&aux, E); printf(%d\n,E); } /*Devuelvo los elementos de aux a P*/ while (esVacia(aux) == 0 ) { cima(aux,&E); pop(&aux); push(pila, E); } }

Programacin II

1 Grao EI

36