Tabla de fichas Indice del Tema 0707
0701 0702 0703 0704 0705 0706 0707 0708

Construir una pila con una lista estática.







Análisis del problema
Una pila es una estructura de datos que está dotada de dos operaciones únicamente: La pilas suelen denominarse estructuas LIFO (last-in, first-out), porque el último elemento en entrar en la pila es el primero que sale.
Esta sencilla estructura tiene mucha aplicación en informática; como se recordará, el stack es precisamente una estructura de pila. Nosotros vamos a construir la pila empleando algo tan sencillo como una lista estática, formada por 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).
Además de poner y quitar, el programa va a ofrecer la posibilidad de visualizar ordenadamente la lista, y también la posibilidad de vaciarla.

Diseño del programa
Estará basado en la estructura genérica de programa ya conocida.. El valor de menu va a ser "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.

Implementación
Una posible versión del programa sería la siguiente:
	/* 
 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"); 
 } 

Comentarios.-

Comprobación y Depuración
No se ha verificado la validez de las entradas (deberían ser números enteros). Por demás el programa se ha verificado y parece funcionar correctamente.

Documentación
Este programa es una simplicísima demostración del concepto de pila. No se ha intentado construir una estructura general en modo alguno.