3.1Definición.
Las pilas son otro tipo de estructura de datos lineales, las cuales presentan restricciones en cuanto a la posición en la cual pueden realizarse las inserciones y las extracciones de elementos.
Una pila es una lista de elementos en la que se pueden insertar y eliminar elementos sólo por uno de los extremos. Como consecuencia, los elementos de una pila serán eliminados en orden inverso al que se insertaron. Es decir, el último elemento que se metió a la pila será el primero en salir de ella.
3.2Especificación.
En la vida cotidiana existen muchos ejemplos de pilas, una pila de platos en una alacena, una pila de latas en un supermercado, una pila de papeles sobre un escritorio, etc.
Debido al orden en que se insertan y eliminan los elementos en una pila, también se le conoce como estructura LIFO (Last In, First Out: último en entrar, primero en salir).

3.3Implantación.
utilizando memoria estática
Se utilizará un arreglo unidimensiottal en el que se guardarán los datos a partir de la posición inicial del
mismo. La posición de inicio del arreglo actuará como fondo de la pila y se requerirá de un apuntador que
indique la posición donde se encuentra el tope de la pila (último elemento añ adido).
Estos datos se pueden encapsular como atributos de un objeto en caso de que se esté utilizando un
lenguaje corno C++, quedando de la siguiente manera la definición de la clase, según el diseño lógico 2:
class Pila
{ private:
Tipoelem datos[MAX] // arreglo para guardar los datos
int tope; // apuntador al último dato añadido
public:
Pila(); // constructor que inicializa como vacía
char Meter(Tipoelem dato);
char Sacar(Tipoelem* dato);
// NO se requiere destructor
};
Las operaciones se implementarán de la siguiente manera:
Pila::Pila()
{ tope = -1; } // este valor indica que no hay datos en la Pila
char Pila::Meter(tipoelem nuevo)
{ if (tope == MAX - 1) // si el apuntador está en la última posición,
// ya no hay tamaño
return 0;
else
{ tope++; // se apunta al nuevo lugar disponible del arreglo
datos[tope]=nuevo; // y se copia el nuevo dato
return l;
}
}
char Pila::Sacar(tipoelem & valor)
{ if (tope == -1) // si el apuntador está en – 1 la pila está vacía
return 0;
else
{ valor = datos[tope];
tope--; // aunque el valor queda en el arreglo lógicamente
// no está en la pila, y su lugar puede ser ocupado nuevamente
return l;
}
}
3.4Aplicación.
Aplicaciones de las pilas
Cualquier aplicación que requiera administrar el orden de entrada de un conjunto de datos requerirá
alguna de estas estructuras.
Una pila será útil cuando la aplicación requiera de un orden inverso al orden de entrada original de los
datos. Un ejemplo típico del uso de una pila lo podernos ver en el manejo de las llamadas a módulos o
subrutinas en un programa (razón por la que un stack está siempre presente en la ejecución de cualquier
programa, aunque sea implícito para el programador). Otro ejemplo del uso de una pila se da en el proceso de
conversión de expresiones a diferentes formatos (situación que se requiere en la implantación de un
compilador).