Professional Documents
Culture Documents
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
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
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:
Cima (PilaVacia) Cima (Push (p, e) ) Pop (PilaVacia) Pop (Push (p, e) ) EsVacia (PilaVacia) EsVacia (Push (p, e))
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.
Programacin II
Pgina 3/8
PILAS.doc
Grficamente sera: Indice cima 11 E0 ... E9 E10 E11 ... Vector elementos E max - 1
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
p->cima -1
p->cima 0
p->cima 1 E2 E1 p->arrayelementos
p->arrayelementos
E1 p->arrayelementos
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
Pgina 6/8
PILAS.doc
Elemento de la pila
E7 Epila
. . .
E1 Epila
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