Estructura de Pilas o Stack
Estructura de Pilas o Stack
Estructura de Pilas o Stack
Introduccin.
Una pila (stack en ingls) es una estructura de datos de tipo LIFO (del ingls
Last In First Out, ltimo en entrar, primero en salir) que permite almacenar y
recuperar datos. Se aplica en multitud de ocasiones en informtica debido a su
simplicidad y ordenacin implcita en la propia estructura.
Representacin grfica de una pila.
Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar
(push), que coloca un objeto en la pila, y su operacin inversa, retirar (o
desapilar, pop), que retira el ltimo elemento apilado.
En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al
ltimo objeto apiIado (denominado TOS, top of stack en ingls). La operacin
retirar permite la obtencin de este elemento, que es retirado de la pila
permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el
nuevo TOS.
Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar
un plato sobre una pila de platos, y una operacin retirar a retirarlo.
Las pilas suelen emplearse en los siguientes contextos:
Evaluacin de expresiones en notacin postfija (notacin polaca inversa).
Reconocedores sintcticos de lenguajes independientes del contexto
Implementacin de recursividad.
1. Historia.
El mtodo de pila para la evaluacin de expresiones fue propuesto en 1955 y
dos aos despus patentado por Fiedrich L.Bauer, quin recibi en 1988 el
premio "IEEE Computer Society Pioneer Award" por su trabajo en el desarrollo
de dicha estructura de datos.
Pila de llamadas.
La Pila de llamadas es un segmento de memoria que utiliza esta estructura de
datos para almacenar informacin sobre las llamadas a subrutinas actualmente
en ejecucin en un programa en proceso.
Cada vez que una nueva subrutina es llamada, se apila una nueva entrada con
informacin sobre sta tal como sus variables locales. En especial, se almacena
aqu el punto de retorno al que regresar cuando esta subrutina termine (para
volver a la subrutina anterior y continuar su ejecucin despus de esta
llamada)..
Pila como tipo abstracto de datos.
A modo de resumen tipo de datos, la pila es un contenedor de nodos y tiene
dos operaciones bsicas: push (o apilar) y pop (o desapilar). 'Push' aade un
nodo a la parte superior de la pila, dejando por debajo el resto de los nodos.
'Pop' elimina y devuelve el actual nodo superior de la pila. Una metfora que se
utiliza con frecuencia es la idea de una pila de platos en una cafetera con
muelle de pila. En esa serie, slo la primera placa es visible y accesible para el
usuario, todas las dems placas permanecen ocultas. Como se aaden las
nuevas placas, cada nueva placa se convierte en la parte superior de la pila,
escondidos debajo de cada plato, empujando a la pila de placas. A medida que
la placa superior se elimina de la pila, la segunda placa se convierte en la parte
superior de la pila. Dos principios importantes son ilustrados por esta metfora:
En primer lugar la ltima salida es un principio, la segunda es que el contenido
de la pila est oculto. Slo la placa de la parte superior es visible, por lo que
para ver lo que hay en la tercera placa, el primer y segundo platos tendrn que
ser retirados.
Operaciones.
Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar, a las que
en las implementaciones modernas de las pilas se suelen aadir ms de uso
habitual.
Implementacin.
Un requisito tpico de almacenamiento de una pila de n elementos es O(n). El
requisito tpico de tiempo de O(1) las operaciones tambin son fciles de
satisfacer con un array o con listas enlazadas simples.
La biblioteca de plantillas de C++ estndar proporciona una "pila" clase
templated que se limita a slo apilar/desapilar operaciones. Java contiene una
biblioteca de la clase Pila que es una especializacin de Vector. Esto podra ser
considerado como un defecto, porque el diseo heredado get () de Vector
mtodo LIFO ignora la limitacin de la Pila.
Estos son ejemplos sencillos de una pila con las operaciones descritas
anteriormente (pero no hay comprobacin de errores).
Ejemplo:
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Collections;
namespace Pilas
{
class Program
{
static void Main(string[] args)
{
int max;
Console.WriteLine("Creacin de una Pila con un determinado
nmero de elementos.");
Console.WriteLine("");
Console.Write("Cantidad de elementos:");
//max = Convert.ToInt32(Console.ReadLine());
max = int.Parse(Console.ReadLine());
Stack<int> pila = new Stack<int>(max);
for (int i=1; i<=max; i++)
{
Console.Write("Elemento {0}: ", i);
pila.Push(Convert.ToInt32(Console.ReadLine()));
}
Console.WriteLine();
Console.WriteLine("Imprimimos los elementos de la Pila:");
for (int i=1; i<=max; i++)
{
Console.WriteLine(pila.Pop());
}
}
}
Console.ReadLine();