martes, 16 de junio de 2015

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.
Considerando que se tiene una pila con una capacidad para almacenar un núm. máximo de elementos –MAX- y que el último de ellos se indica con TOPE, a continuación se presentan los algoritmos de las operaciones mencionadas. Si la pila está vacía, entonces TOPE es igual a 0.    


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


 Hacer BAND  _______ VERDADERO (LA PILA ESTA LLENA)

Si no


 Hacer BAND    ______    FALSO (LA PILA NO ESTA LLENA)

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.