Professional Documents
Culture Documents
INTRODUCCIN
El objetivo es comprender el empleo de las pilas.
II. Definicin
La pila es una estructura de datos que los almacena en el orden LIFO (Last In First Out) en espaol, (ltimo en entrar, primero en salir). La recuperacin de los datos es hecha en el orden inverso a su insercin. Ya que la insercin es siempre hecha al inicio de la lista, el 1er elemento de la lista ser el ultimo elemento ingresado, por lo tanto estar en la cabeza de la pila. No se utiliza un puntero fin, ya que el objetivo es tratar con una pila. Lo interesante es que el ltimo elemento ingresado, ser el 1er elemento recuperado.
Figura 1: La pila
typedef struct ElementoLista { char *dato; struct ElementoLista *siguiente; }Elemento; Para las operaciones sobre la pila, vamos a guardar ciertos elementos: el primer elemento el nmero de elementos El 1er elemento, que se encuentra en la cabeza de la pila, realiza la operacin de recuperacin de los datos situados en la parte superior de la pila. Para ello, utilizamos otra estructura, aunque no es obligatorio, puede utilizar 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 nmero de elementos. Cualquiera que sea su posicin en la lista, el puntero inicio apunta siempre hacia el 1er elemento, que est en la cabeza de la pila. El campo tamao contendr el nmero de elementos de la pila, cualquiera que sea la operacin efectuada sobre dicha pila.
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 primera figura muestra el inicio de la insercin, por lo tanto el tamao es 1 despus de la insercin. La caracterstica de la pila no es muy relevante con un slo elemento, ya que es el nico a recuperar.
Figura 2: Insercin en pila vaca En cambio en la 2da figura observamos el comportamiento de la pila. Lo que debemos retener es que la insercin siempre se hace en la parte superior de la pila (al inicio de la lista).
int desapilar (Pila *tas); La funcin devuelve -1 en caso de error, si no devuelve 0. Las 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.
La 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; }
D. 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; } }
V. Ejemplo completo
pila.h
/*********************\ * pila.h * \*********************/ typedef struct ElementoLista{ char *dato; struct ElementoLista *siguiente; } Elemento; typedef struct ListaUbicacin{ Elemento *inicio; int tamao; } Pila; /* inicializacin */
void inicializacin (Pila *tas); /* APILAR*/ int apilar (Pile *tas, char *dato); /* DESAPILAR*/ int desapilar (Pila *tas); /* Visualizacin del elemento en la cabeza de la pila (LastInFirstOut) */ #define pila_dato(tas) tas->inicio->dato /* muestra la pila */ void muestra (Pila *tas);
pila_function.h
/***********************\ * pila_function.h * \***********************/ void inicializacin (Pila * tas){ tas->inicio = NULL; tas->tamao = 0; } /* 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++; } /* desapilar (eliminar un elemento de la pila */ 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 */ 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; }
pila.c
/*********************\ * pila.c * \*********************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include "pila.h" #include "pila_function.h" int main () { Pila *tas; char *nom; if ((tas = (Pila *) malloc (sizeof (Pila))) == NULL) return -1; if ((nom = (char *) malloc (50 * sizeof (char))) == NULL) return -1; inicializacin (tas); printf ("Ingrese una palabra: "); scanf ("%s", nom); apilar (tas, nom); printf ("La pila (%de elementos): \n",tas->tamao); printf("\n********** Cabeza de la PILA **********\n"); muestra(tas); printf("__________ Bajo de la PILA __________\n\n"); printf ("Ingrese una palabra: "); scanf ("%s", nom); apilar (tas, nom); printf ("La pila (%de elementos): \n",tas->tamao); printf("\n********** Cabeza de la PILA **********\n"); muestra(tas); printf("__________ Bajo de la PILA __________\n\n"); printf ("Ingrese una palabra: "); scanf ("%s", nom); apilar (tas, nom); printf ("La pila (%de elementos): \n",tas->tamao); printf("\n********** Cabeza de la PILA **********\n"); muestra(tas); printf("__________ Bajo de la PILA __________\n\n"); printf ("\nLa ultima entrada (LastInFirstOut) [ %s ] sera eliminada",
pile_dato(tas)); printf ("\nLa ultima entrada es eliminada\n"); desapilar (tas); /* eliminacin del ultimo elemento ingresado */ printf ("La pila (%de elementos): \n",tas->tamao); printf("\n********** Cabeza de la PILA **********\n"); muestra(tas); printf("__________ Bajo de la PILA __________\n\n"); return 0; }
Ejercicio Explicar el subalgoritmo funcin recursiva de la funcin de Ackermann. Problema La pila es visualizada ya sea creciente de abajo hacia arriba (como pilas del mundo real), o, con el mximo elemento de la pila en una posicin fija, o creciente, de izquierda a derecha, por lo que el mximo elemento se convierte en el mximo a "la derecha". Esta visualizacin puede ser independiente de la estructura real de la pila en la memoria. Esto significa que rotar a la derecha es mover el primer elemento a la tercera posicin, la segunda a la primera y la tercera a la segunda. Aqu hay dos equivalentes visualizaciones de este proceso:
Manzana Pltano Fresa o simplemente, Fresa Manzana ==rotar a la derecha==> Pltano Fresa Manzana
Pltano Manzana
==rotar a la izquierda==>
Fresa Pltano