DIM_PILA
elementos. Esto significa, desde luego, que nuestra pila va a tener una capacidad limitada. Cuando se acabe el espacio, notificaremos al usuario que es imposible añadir más elementos. Del mismo modo, cuando la pila quede vacía,comunicaremos al usuario que no es posible quitar elementos de ella. Las pilas se organizan siempre tomando como elemento fundamental el puntero de pila, que por convención se denomina
sp
(como abreviatura de stack pointer o puntero de pila). El
sp
se define como la dirección (el índice, en nuestro caso) de la posición en que se almacenará el próximo elemento. Igualmente importante, el tope de la pila (
top
, en la jerga) es la dirección de aquel elemento que se sacaría si en ese momento se diera la orden de quitar. Entonces, una pila es una estructura en que los datos se añaden en la posición del
sp
y se quitan en la posición del
top
(tanto el
sp
como el
top
se actualizan automáticamente después de cada operación).
P)ush Po)p V)er Va)ciar S)alir
", y las opciones válidas, almacenadas en
opcionesvalidas
va a ser "
POVASQ
". Dada la sencillez del programa, no se han empleado funciones. La limitación más grave del programa es que la pila tiene un número finito de posiciones. Normalmente, se recurrirá a métodos dinámicos para reservar espacio para la pila; en tal caso, esta limitación se reduce mucho, porque el tamaño de la pila pasa a depender de la cantidad de memoria disponible para la aplicación, en lugar de estar prefijado de antemano. Véase la
sección correspondiente
. /* Este programa muestra la creación y utilización de una pila basada en una lista estática. No se emplean funciones. */ #include<stdio.h> #include<ctype.h> #include<string.h> /* DECLARACIONES GENERICAS */ int fin; char instruccion; char menu[80]; char opcionesvalidas[80]; /* DECLARACIONES ESPECIFICAS */ #define Tipo_base int #define DIM_PILA 5 Tipo_base pila[DIM_PILA]; int sp = 0, top, i; /* sp : Stack Pointer, o puntero de pila */ /* top : la cima de la pila */ int main(void) { /* Iniciaciones generales */ fin = 0; strcpy(menu,"P)ush Po)p V)er Va)ciar S)alir"); strcpy(opcionesvalidas,"POVASQ"); do { do { puts(menu); scanf("%c%*c",&instruccion); instruccion=toupper(instruccion); } while (!strchr(opcionesvalidas,instruccion)); switch(instruccion) { case 'P': { /* PUSH */ if (sp < DIM_PILA) { printf("Escriba el valor: "); scanf("%d%*c", &top); pila[sp]=top; sp++; } else printf("\nLa pila está llena.\n\n"); } break; case 'O': { /* POP */ if (sp) printf("\nTop = %d\n",pila[--sp]); else printf("\nLa pila está vacía.\n\n"); } break; case 'V': { /* VER */ printf("\n"); if (sp) { for(i=0;i<sp;i++) printf("pila[%d] = %d\n",i,pila[i]); printf("\n"); } else printf("\nLa pila está vacía.\n\n"); } break; case 'A': { /* VACIAR */ if (sp) sp=0; else printf("\nLa pila está vacía.\n\n"); } break; case 'S': case 'Q': { fin = 1; puts("Nos vamos!\n"); } break; } } while (!fin); puts("\n\nTerminación normal del programa.\n"); }