Sei sulla pagina 1di 19

PILAS

Descripcin General
Una Pila es una clase especial de lista en la cual todas las inserciones y borrados tienen lugar en un extremo denominado extremo, cabeza o tope. otro nombre para las pilas son listas FIFO (ltimo en entrar, primero en salir) o listas pushdown (empujadas hacia abajo).

First In, First Out = FIFO

OPERACIONES PRIMITIVAS DE LAS PILAS.


pila crear () Efecto: Devuelve un valor del tipo pila preparado para ser usado y que contiene un valor de pila vaca. void destruir (pila *P) Argumentos: Una pila P. Efecto: Libera los recursos que mantienen la lista P de forma que para volver a usarla se debe asignar una nueva pila con la operacin de creacin.

telemento tope (pila P) Argumentos: Una pila P que debe ser no vaca. Efecto: Devuelve el elemento en la cabeza de la pila P.
void pop (pila P) Argumentos: Una pila P que debe ser no vaca. Es modificada.

void push (telemento x, pila P) Argumentos: x: Un elemento que deseamos poner en la pila. p: Una pila P val donde deseamos poner el elemento x.
Efecto: Inserta el elemento x en el tope de la pila P. El elemento tope antiguo se convierte en el siguiente al tope y as sucesivamente.

int vacia (pila P) Argumentos: Una pila P. Efecto: Devuelve si P es una pila vaca.

Implementacin C++
El puntero siguiente permitir el acceso al prximo elemento. typedef struct ElementoLista { char *dato; struct ElementoLista *siguiente; }Elemento; Para permitir las operaciones sobre la pila, vamos a guardar ciertos elementos: el primer elemento el numero de elementos

Para ello, ser utilizada otra estructura (no es obligatorio, pueden ser utilizadas variables). typedef struct ListaUbicacin{ Elemento *inicio; int tamao; } Pila;
El puntero inicio contendr la direccin del 1er elemento de la lista. La variable tamao contiene el numero de elementos

Inicializacin
void inicializacin (Pila *tas); Esta operacin debe ser hecha antes de cualquier otra operacin sobre la pila. Esta inicializa el puntero inicio con el puntero NULL, y el tamao con el valor 0. void inicializacin (Pila * tas){ tas->inicio = NULL; tas->tamao = 0; }

Insercin de un elemento en la pila


algoritmo de insercin y registro de los elementos: declaracin del elemento a insertar asignacin de la memoria para el nuevo elemento rellenar el contenido del campo de datos actualizar el puntero inicio hacia el 1er elemento (la cabeza de la pila) Actualizar el tamao de la pila.

Modelo de la funcin:
int apilar (Pila *tas, char *dato);

La funcin /* apilar (aadir) un elemento en la pila */ int apilar (Pila * tas, char *dato){ Elemento *nuevo_elemento; if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elemento))) == NULL) return -1; if ((nuevo_elemento->dato = (char *) malloc (50 * sizeof (char))) == NULL) return -1; strcpy (nuevo_elemento->dato, dato); nuevo_elemento->siguiente = tas->inicio; tas->inicio = nuevo_elemento; tas->tamao++; }

Eliminar un elemento de la pila


Para eliminar un elemento de la pila, simplemente hay que eliminar el elemento hacia el cual apunta el puntero inicio. Esta operacin no permite recuperar el dato en la cabeza de la pila, solo eliminarlo. Modelo de la funcin: int desapilar (Pila *tas);

etapas:
el puntero sup_elemento contendr la direccin del 1er elemento el puntero inicio apuntar hacia el 2do elemento (despus de la eliminacin del 1er elemento, el 2do elemento estar en la cabeza de la pila) el tamao de la pila disminuir un elemento.

funcin int desapilar (Pila * tas){ Elemento *sup_elemento; if (tas->tamao == 0) return -1; sup_elemento = tas->inicio; tas->inicio = tas->inicio->siguiente; free (sup_elemento->dato); free (sup_elemento); tas->tamao--; return 0; }

Visualizacin de la pila Para mostrar la pila entera, es necesario posicionarse al inicio de la pila (el puntero inicio lo permitir). Luego, utilizando el puntero siguiente de cada elemento, la pila es recorrida del 1er hacia el ultimo elemento. La condicin para detenerse es dada por el tamao de la pila.

La funcin /* visualizacin de la pila */ void muestra (Pila * tas){ Elemento *actual; int i; actual = tas->inicio; for(i=0;i<tas->tamao;++i){ printf("\t\t%s\n", actual->dato); actual = actual->siguiente; } }

Potrebbero piacerti anche