Que es una Pila
Una pila representa una estructura lineal de datos en que se puede agregar o quitar elementos únicamente por uno de los dos extremos. En consecuencia, los elementos de una pila se eliminan en el orden inverso al que se insertaron. Debido a está característica, se le conoce como estructura LIFO (last input, first output) . Una pila tambien es una colección de datos a los cuales se les puede acceder mediante un extremo, que se conoce generalmente como tope
- Existen muchos casos prácticos en los que se utiliza la idea de pila: Ejemplo; pila de platos, en el supermercado latas.
- Las pilas con estructuras lineales como los arreglos, ya que sus componentes ocupan lugares sucesivos en la ED y c/u tienen un único sucesor/predecesor, con excepción del primero/últim
Representación de Pilas
Las pilas no son estructuras fundamentales de datos; es decir no están definidas como tales en los lenguajes de programación.
Para su representación requieren de otras EDs, como:
· Arreglos
· Listas
OC/SG utilizan arreglos. Es importante definir el tamaño de la máximo de la pila, así como una variable auxiliar que se denomina TOPE. Está variable se utiliza para indicar el último elemento que se insertó en la pila
* Apilar: Agregar un
nuevo elemento a una pila
*Desapilar : elimina el tope de la pila y lo devuelve. El elemento que se devuelve es siempre el último que se agrego

Características de las pilas
La característica
más importante de una pila es que el último elemento insertado en ella es el
primero en suprimirse, por esa razón en ocasiones una pila se denomina una list
"ultimo al entrar primero al salir" lifo (last,in,first,out)
Errores en las pilas
Al utilizar arreglos para implementar pilas se
tiene la limitación de que se debe reservar el espacio en memoria con
anticipación. Una vez dado un máximo de capacidad a la pila no es posible
insertar un número de elementos mayor que el máximo establecido. Si esto
ocurre, en otras palabras si la pila esta llena y se intenta insertar un nuevo
elemento, se producirá un error conocido como desbordamiento –overflow
Una
posible solución a este tipo de inconvenientes consiste en definir pilas de
gran tamaño, pero esto resultará ineficiente y costoso si solo se utilizarán
algunos elementos. No siempre es viable saber con exactitud el número de
elementos a tratar, y siempre existe la posibilidad de que ocurra un error de
desbordamiento
otra solución consiste
en usar espacios compartidos de memoria para la implementación de pilas.
Supongamos que se necesitan dos pilas, c/u con un tamaño máximo de N elementos.
Se definirá entonces un arreglo unidimensional de 2N elementos, en lugar de 2
arreglos de N elementos c/u
Otro error que se puede presentar es tratar de eliminar un
elemento de un pila vacía. Este tipo de error se le conoce como
subdesbordamiento –underflow-
Operaciones con pilas
- Insertar un elemento –push- en la pila
- Eliminar -pop – de la pila
- Pila vacía
- Pila llena

Aunque la operación push es aplicable a cualquier pila si la memoria lo permite la operación pop no puede aplicarse a una pila vacía porque esta pila no tiene elementos para remover. Antes de aplicar la operación pop tenemos que asegurarnos de que la pila no este vacía.
Algoritmo pila_vacia (PILA, TOPE, BAND)
Este algoritmo verifica si una estructura tipo pila esta vacía asignando a BAND el valor de verdad correspondiente. La pila se incrementa en un arreglo unidimensional. Tope es un parámetro de tipo entero y BAND es un parámetro de tipo booleano.
1
Si TOPE = o) (verifica si no hay elemento almacenado en la pila)
Entonces
Hacer BAND _____ VERDADERO (la pila está vacía)
Si no
Hacer BAND _____ FALSO ( la pila no está vacía)
2
(Fin del condicional del paso 1)
Algoritmo Pila llena
PILA_LLENA (PILA, TOPE, MAX, BAND)
Este
algoritmo verifica si una estructura tipo pila esta llena asignando a BAND el
de verdad correspondiente. La pila se implementa en un arreglo unidimensional
de mas elementos. TOPE es un parámetro de tipo entero. BAND es un parámetro de
tipo booleano.
Si (TOPE
= MAX)
Entonces
Si no
2
Fin del
condicional del paso 1
Aplicaciones de Pilas
Las pilas son un EDs muy usadas en la solución de diversos tipos de problemas, en el área de computación. Algunos de los casos más representativos de aplicación de las mismas son:
· Llamadas a subprogramas
· Recursividad
· tratamiento de expresiones aritméticas
· Ordenación
Llamadas
a subprogramas
Cuando se tiene un
programa que llama a un subprograma, también conocido como módulo o función,
internamente se usan pilas para guardar el estado de las variables del
programa, así como instrucciones pendientes de ejecución en el momento que se
hace la llamada.
Cuando termina la
ejecución del subprograma, los valores almacenados en la pila se recuperan para
continuar con la ejecución del programa en el punto en el cual fue
interrumpido.
Además de las
variables se recupera la dirección del programa en la que se hizo la llamada, porque
a esa posición se regresa el control del proceso.
Importancia
Finalmente podemos concluir que las pilas son necesarias
en este tipo de aplicaciones por lo siguiente:
*Permiten guardar la dirección del programa, o
subprograma, desde donde se hizo la llamada a otros subprogramas, para regresar
posteriormente y seguir ejecutándolo a partir de la instrucción inmediata a la
llamada.
* Permiten guardar el estado de las variables en el momento en que se hace la
llamada, para seguir ocupándolas al regresar del subprograma.
