Primero se define la estructura a utilizar: struct pila { tipo variables; struct pila *ant; }*CAB=NULL,*AUX=NULL; donde tipo variables sern las diferentes variables que guardaremos en la estructura, struct pila *ant es un puntero que apunta al elemento de tipo pila introducido anteriormente, *CAB ser donde se guardar el ltimo elemento insertado en la pila (Tope) y *AUX nos servir para guardar elementos temporalmente y para recorrer la pila al visualizarla. Antes de insertar un elemento, se debe comprobar si la pila est vaca o no. Si lo estuviera procederemos a insertar el primer elemento: CAB=AUX; CAB->ant=NULL; Si ya hubiera algn elemento se creara uno nuevo apuntado por AUX y haremos que AUX->ant apunte a CAB, que en este momento contiene la direccin del elemento insertado anteriormente. Tras esto haremos que CAB apunte al ltimo elemento insertado, que ser la nueva cabeza de la pila: AUX->ant=CAB; CAB=AUX; Para extraer un elemento de la pila debemos hacer que AUX apunte a la misma direccin que CAB, despus hacemos que CAB apunte a CAB->ant, con lo que el elemento anterior pasar a ser la cabeza de la pila. Posteriormente, se libera la memoria de la zona apuntada por AUX. Es importante no olvidarse de controlar si existe algn elemento (si CAB es igual a NULL la pila est vaca): if (CAB==NULL) return; AUX=CAB; CAB=CAB->ant; free(AUX); Por ltimo, para visualizar los elementos de la pila, haremos que el puntero auxiliar AUX apunte a la cabeza de la pila, o sea, a CAB. Tras esto iremos visualizando el contenido de la pila, haciendo que AUX tome la direccin de AUX->ant, mientras AUX sea distinto de NULL. Tambin es importante controlar que la pila no est vaca. if (CAB==NULL) return; AUX=CAB; while (AUX!=NULL) { printf("%s",AUX->nombre); AUX=AUX->ant; }
1.2.- Funciones Importantes A continuacin se listan y detallan brevemente algunas funciones, que se ocuparan para llevar a cabo la implementacin de la pila. 1. getch: Lee y retorna un nico carcter introducido mediante el teclado por el usuario. No muestra el carcter por la pantalla. 2. getche: Lee y retorna un nico carcter introducido mediante el teclado por el usuario. Muestra el carcter por la pantalla. 3. gets: Lee y guarda una cadena introducida por teclado. 4. malloc: Reserva una porcin de memoria libre de n bytes y devuelve un puntero sobre el comienzo de dicho espacio. Si no hay suficiente memoria libre para satisfacer la peticin, malloc ( ) devuelve NULL. 5. free: Libera la memoria de la zona apuntada por un puntero. 6. sizeof: Operador que retorna el tamao en bytes de una variable.
/* Ejemplo de una Pila, con punteros */ #include #include #include #include void void void void void <stdio.h> <conio.h> <stdlib.h> <alloc.h>
struct pila { char nombre[20]; struct pila *ant; }*CAB=NULL,*AUX=NULL; main() { textcolor(WHITE); textbackground(BLUE); char opc; do { clrscr(); gotoxy(30,5); printf("EJEMPLO DE UNA PILA"); gotoxy(25,8); printf("1.- Ingresar elemento"); gotoxy(25,10);printf("2.- Extraer elemento"); gotoxy(25,12);printf("3.- Visualizar la pila "); gotoxy(25,14);printf("4.- Visualizar el tope de la pila"); gotoxy(25,16);printf("5.- Determinar si la pila esta vaca"); gotoxy(25,18);printf("6.- Salir"); gotoxy(25,21);printf("Ingrese la opcin [_]"); gotoxy(45,21);opc=getch( ); switch(opc) { case '1': Ingresar( ); break; case '2': Extraer( ); break; case '3': Visualizar( ); break; case '4': Tope( ); break; case '5': Vacia( ); } }while (opc!='6');
return 0; } void Ingresar(void) //Permite ingresar un elemento en la parte superior de la pila { AUX=(struct pila *)malloc(sizeof(struct pila)); clrscr(); printf("\n Nombre: "); gets(AUX->nombre); if (CAB==NULL) { CAB=AUX; AUX->ant=NULL; } else { AUX->ant=CAB; CAB=AUX; } } void Extraer(void) //Permite extraer el elemento que se encuentra en el tope de la pila { if (CAB==NULL) return; AUX=CAB; CAB=CAB->ant; free(AUX); } void Visualizar(void) //Permite visualizar los elementos contenidos en la pila { if (CAB==NULL) return; clrscr(); AUX=CAB; while (AUX!=NULL) { printf("\n Nombre: %s",AUX->nombre); AUX=AUX->ant; } getch( ); } void Tope(void) //Muestra el elemento que se encuentra en la parte superior de la pila { if (CAB==NULL) return; clrscr(); printf("\n Nombre: %s",CAB->nombre); getch(); }
void Vacia(void) //Permite determinar si la pila esta vaca { clrscr(); if (CAB==NULL) printf("\n La pila esta vaca"); else printf("\n La pila no esta vaca. \n Contiene al menos un elemento"); getch(); }