Está en la página 1de 8

TEMA 2: TAD PILA

1. 2. 3.

ndice Introduccin Especificacin Formal Realizaciones de la estructura Pila 3.1. Realizacin mediante memoria esttica con pseudocdigo 3.2. Realizacin mediante memoria dinmica con pseudocdigo

Introduccin
Las pilas son estructuras de datos muy tiles y con mltiples aplicaciones en la vida real. Ejemplos claros de pilas pueden ser un montn de libros antes de ser catalogados en una biblioteca, una pila de platos en un fregadero, una pila de latas en la estantera de un supermercado, etc. La forma natural de interactuar con estas estructuras, por ejemplo, si queremos aadir un nuevo elemento, lo podremos incluir por la parte superior, de igual forma, si queremos extraer un elemento, siempre podremos acceder al que ocupa la posicin superior de dicho montn, nunca el que est en medio a en la parte inferior, ya que la estructura se desmoronara totalmente. Justamente, esta caracterstica de que slo exista un extremo de la estructura por el que podamos aadir o extraer elementos es lo que hace que la estructura sea una PILA, adems podemos destacar su funcionamiento siguiendo la poltica LIFO (Last In First Out), es decir, el ltimo elemento insertado es el primero que puede salir de la pila. Por tanto, es una estructura que devuelve los datos en orden inverso a como se han almacenado en ella. Definicin: Una PILA es una estructura ordenada y homognea, en la que podemos apilar o desapilar elementos en una nica posicin llamada CIMA, y siguiendo una poltica LIFO. Segn esto, la estructura pila slo tendr como elemento accesible el que ocupa la posicin de la cima. Por tanto, para procesar cualquier elemento de la pila, exige que dicho elemento ocupe la cima de la pila.
Push Push Push Pop Push

cima cima cima Pila Vaca

E1

E2 E1

E3 E2 E1

cima cima

E2 E1

E4 E2 E1

Cuando la pila es vaca, no tiene ningn elemento, entonces la cima de la pila tiene un valor indefinido.

Programacin II

Pgina 1/8 28/01/2013

PILAS.doc

Especificacin Formal
Las operaciones que permitirn manejar la estructura pila, entre otras, son las siguientes: PilaVacia: Crea una pila vaca, sin elementos. Push: Inserta un elemento en la pila y se obtiene la pila con dicho elemento ms. Cima: Devuelve el elemento de la cima de la pila. Pop: Elimina el elemento de la cima de la pila y devuelve la pila resultante. EsVacia: Determina si una pila tiene elementos o no. Donde las operaciones constructoras la estructura son precisamente PilaVacia y Push, que con sucesivas aplicaciones permiten conseguir cualquier pila. Push (Push (Push (PilaVacia, e1), e2), e3) Grficamente sera:

e3 e2 e1

La especificacin formal para el TAD Pila ser la siguiente: TAD TPILA Valores: Coleccin de elementos homogneos y que opera segn un modelo LIFO. Sintaxis: * PilaVacia * Push (TPILA, ELEMENTO) Cima (TPILA) Pop (TPILA) EsVacia (TPILA) Semntica:

TPILA TPILA TELEMENTO TPILA BOOLEAN

p TPILA, e ELEMENTO ERROR e ERROR p TRUE FALSE

Cima (PilaVacia) Cima (Push (p, e) ) Pop (PilaVacia) Pop (Push (p, e) ) EsVacia (PilaVacia) EsVacia (Push (p, e))

Realizaciones de la estructura PILA


Vamos a definir con ms detalle las operaciones de manejo de la estructura Pila definida conceptualmente, indicando los requisitos que deben de cumplir para realizarlas y si los parmetros son de entrada, de salida o ambas cosas, etc. PilaVacia ( /* E/S */ TPILA p)
Programacin II Pgina 2/8

PILAS.doc

Precondicin: Ninguna Postcondicin: Obtiene la pila p sin elementos. Por tanto, la pila p se modifica. Push ( /* E/S */ TPILA p; /* E */ ELEMENTO e ) Precondicin: Ninguna Postcondicin: Almacena en la pila p el elemento e. Por tanto, la pila p se modifica.

EsVacia ( /* E */ TPILA p; /* S */ BOOLEAN respuesta) Precondicin: Ninguna Postcondicin: Decide si la pila p tiene elementos o no. Por tanto, la pila p no se modifica.
Cima ( /* E */ TPILA p; /* S */ ELEMENTO e) Precondicin: La pila p no puede estar vaca Postcondicin: Obtiene el elemento que ocupa la cima de la pila p. Por tanto, la pila p no se modifica. Pop ( /* E/S */ TPILA p) Precondicin: La pila p no puede estar vaca Postcondicin: Elimina de la pila p el elemento que ocupa la cima de la pila. Por tanto, la pila p se modifica.

Realizacin mediante memoria esttica en pseudocdigo


La realizacin mediante memoria esttica har uso de los ARRAYs para implementar la estructura pila. Consistir en guardar los elementos de la pila de forma consecutiva en un array, teniendo en cuenta las diferencias entre ambos tipos de datos: ARRAYS PILAS Se accede a cualquiera de sus elementos. Slo se puede acceder al elemento cima de la pila. Estructura con una dimensin fija. Estructura sin lmite de elementos. Para poder implementar la estructura Pila a travs de Arrays, adems de un vector en el que se almacenen los elementos, es necesario contar con otra variable que indique en cada momento cul es el elemento cima de la pila. Aun as, se est restringiendo el concepto de pila, ya que la utilizacin de arrays impone un tope mximo de elementos a la pila, cuando su filosofa es otra. La realizacin se har a travs de una estructura o registro formado por dos campos, uno el array de elementos y otro campo para almacenar el ndice de la posicin que acta de cima de la pila.

Programacin II

Pgina 3/8

PILAS.doc

Grficamente sera: Indice cima 11 E0 ... E9 E10 E11 ... Vector elementos E max - 1

Estructura Tpila Implementacin mediante array

Las declaraciones para poder hacer esta implementacin son: #define MAX ... /* nmero mximo de elementos que podr almacenar la pila */ typedef .... TELEMENTO ; /* tipo de datos correspondiente a los elementos de la pila */ typedef struct { TELEMENTO arrayelementos[MAX]; int cima; } STPILA ; typedef STPILA * TPILA;

Variables

TPILA p;

Segn esta definicin del tipo Pila, las operaciones se podrn implementar como sigue: PilaVacia ( /* E/S */ TPILA p) Precondicin: Ninguna Postcondicin: Obtiene la pila p sin elementos. Por tanto, la pila p se modifica. void PilaVacia (TPILA *p) { *p = (TPILA) malloc(sizeof(STPILA)); (*p)->cima = -1; /*Valor asignado por nosotros para indicar que la pila est vaca. */ }

EsLlena ( /* E */ TPILA p; /* S */ BOOLEAN respuesta) Precondicin: Ninguna Postcondicin: Decide si la pila p no tiene capacidad para nuevos elementos. Por tanto, la pila p no se modifica. int EsLlena (TPILA p) { if (p->cima == MAX-1) return 1; else return 0; }

Programacin II

Pgina 4/8

PILAS.doc

Push ( /* E/S */ TPILA p; /* E */ TELEMENTO e ) Precondicin: La pila no debe estar llena Postcondicin: Almacena en la pila p el elemento e. Por tanto, la pila p se modifica. void Push (TPILA *p, TELEMENTO e) { int resp; resp = EsLlena(*p); if (resp == 1) printf("ERROR, la pila est llena\n"); else { (*p)->cima++; (*p)->arrayelementos[(*p)->cima] = e ; } } EsVacia ( /* E */ TPILA p; /* S */ BOOLEAN respuesta) Precondicin: Ninguna Postcondicin: Decide si la pila p tiene elementos o no. Por tanto, la pila p no se modifica. int EsVacia (TPILA p ) { if (p->cima == -1) return 1; else return 0; } Cima ( /* E */ TPILA p; /* S */ TELEMENTO e) Precondicin: La pila p no puede estar vaca Postcondicin: Obtiene el elemento que ocupa la cima de la pila p. Por tanto, la pila p no se modifica. void Cima (TPILA p, TELEMENTO * pe) { int respuesta; respuesta = EsVacia(p); if (respuesta==1) printf("ERROR, la pila no tiene elementos\n"); else *pe = p->arrayelementos [p->cima]; } Pop ( /* E/S */ TPILA p) Precondicin: La pila p no puede estar vaca Postcondicin: Elimina de la pila p el elemento que ocupa la cima de la pila. Por tanto, la pila p se modifica. void Pop (TPILA *p) { int respuesta; respuesta = EsVacia(*p); if (respuesta == 1)
Programacin II Pgina 5/8

PILAS.doc

printf("ERROR, la pila no tiene elementos\n"); else (*p)->cima = (*p)->cima - 1; }

Un ejemplo podra ser el siguiente:


PilaVacia (p) Push (p, E1) Push (p,E2)

p->cima -1

p->cima 0

p->cima 1 E2 E1 p->arrayelementos

p->arrayelementos

E1 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

Realizacin mediante memoria dinmica en C


La realizacin mediante memoria dinmica har uso de los PUNTEROS para implementar la estructura pila. Para ello haremos las siguientes consideraciones: PILA Slo se puede acceder al elemento cima de la pila. Es una estructura ordenada. ESTRUCTURA DINMICA El puntero slo acceder a la posicin de memoria de la estructura dinmica que acte de CIMA de la pila. Por tanto, identificaremos PILA con un PUNTERO. La estructura dinmica se formar con elementos de tipo registro (los llamaremos NODOS) con los siguientes campos: Valor del elemento de la pila. Puntero con la direccin de memoria del siguiente nodo de la pila.

Programacin II

Pgina 6/8

PILAS.doc

Grficamente cada nodo de la Pila ser:

Elemento de la pila

Puntero al siguiente nodo

As, la estructura Pila sera como:


TPila E8 E7 ... cima p cima E8 Epila

E7 Epila

. . .

E1 Epila

Implementacin mediante variables dinmicas E1 Tipo abstracto

Las declaraciones para poder hacer esta implementacin son: Tipos typedef ... TELEMENTO ; /* tipo de datos correspondiente a los elementos de la pila */ { TELEMENTO dato; struct nodo * sig; } TNodo; typedef TNodo * TPILA; Variables TPILA p; typedef struct nodo

Segn esta definicin del tipo Pila, las operaciones se podrn implementar como sigue: PilaVacia ( /* E/S */ TPILA p) Precondicin: Ninguna Postcondicin: Obtiene la pila p sin elementos. Por tanto, la pila p se modifica. void PilaVacia (TPILA *p) { *p = NULL; /*Valor NULO en un puntero, para indicar que la pila est vaca. */ }

Push ( /* E/S */ TPILA p; /* E */ TELEMENTO e ) Precondicin: Ninguna Postcondicin: Almacena en la pila p el elemento e. Por tanto, la pila p se modifica. void Push (TPILA * p , TELEMENTO e) { TPILA q; q= (TPILA) malloc (sizeof(TNodo)); q->dato = e ; q->sig = *p ; *p = q; }

Programacin II

Pgina 7/8

PILAS.doc

EsVacia ( /* E */ TPILA p; /* S */ BOOLEAN respuesta) Precondicin: Ninguna Postcondicin: Decide si la pila p tiene elementos o no. Por tanto, la pila p no se modifica. int EsVacia (TPILA p ) { if (p == NULL) return 1; else return 0; }

Cima ( /* E / TPILA p; /* S */ TELEMENTO e) Precondicin: La pila p no puede estar vaca Postcondicin: Obtiene el elemento que ocupa la cima de la pila p. Por tanto, la pila p no se modifica. void Cima (TPILA p, TELEMENTO * pe) { int respuesta; respuesta = EsVacia(p); if (respuesta == 1) printf (ERROR, la pila no tiene elementos\n); else *pe = p->dato; }

Pop ( /* E/S */ TPILA p) Precondicin: La pila p no puede estar vaca Postcondicin: Elimina de la pila p el elemento que ocupa la cima de la pila. Por tanto, la pila p se modifica. 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

Pgina 8/8