You are on page 1of 5

PILAS (STACK)

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 apliado (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.
Ejemplo
Forma principal

Procedimiento: Insercin de un elemento en Pila


Algoritmo
Insercion(Pila, Cima, Elemento)
1. [Pila llena?]
Si Cima = MaxPila, entonces:
- Escribir: Desbordamiento (Overflow) y Volver
Cima = Cima + 1;
Pila[Cima] = Elemento

Cdigo
void CmdInsercionClick(object sender, EventArgs e)
{
string elemento = txtElemento.Text;
txtElemento.Text = "";
txtElemento.Focus();
if (frmPrincipal.Cima == frmPrincipal.MaxPila)
{
MessageBox.Show("Pila llena (Overflow)");
return;
}
frmPrincipal.Cima = frmPrincipal.Cima + 1;
frmPrincipal.Pila[frmPrincipal.Cima] = elemento; // Inserta
elemento en Pila
}
Corrida

Procedimiento: Recorrido de elementos en Pila


Algoritmo
RECORRIDO(Pila, Top)
1. Apuntador = Top
2. repetir paso 3 mientras Apuntador != nulo
3. imprimir Pila(Apunatdor)
4. Apuntador = Apuntador - 1.
Fin del ciclo.
5. Salir.
Cdigo
void CmdRecorrerClick(object sender, EventArgs e)
{
// Verifica si la Pila esta vacia

if (frmPrincipal.Cima == -1)
{
MessageBox.Show("Pila Vacia (Underflow)");
return;
}
int i = 0;
do
{
lsRecorrer.Items.Add(frmPrincipal.Pila[i]);
i = i + 1;
} while (i <= frmPrincipal.Cima);
}
Corrida

Procedimiento: Bsqueda de un elemento en Pila


Algoritmo
BUSQUEDA(Pila, Top, Elemento)
1. Si Top != Nulo
Apuntador = Top
2. Repetir mientras Apuntador != Nulo
3. Si Pila[Apuntador] = Elemento
Imprimir El Dato fue encontrado y Salir
Apuntador = Apuntador - 1
Fin del ciclo
Si no:
Imprimir El Dato no se encontr
4. Salir.
Cdigo
void CmdBuscarClick(object sender, EventArgs e)
{
string elemento = txtElemento.Text;
txtElemento.Text = "";
txtElemento.Focus();
// Verifica si la pila esta vacia

if (frmPrincipal.Cima == -1)
{
MessageBox.Show("Pila vacia (Underflow)");
return;
}
int i = 0;
do
{
int res =
string.Compare(elemento,frmPrincipal.Pila[i]);
if (res == 0)
{
lsRes.Items.Add(frmPrincipal.Pila[i]);
return;
}
i = i + 1;
} while (i <= frmPrincipal.Cima);
MessageBox.Show("Elemento no encontrado en Pila");
}
Corrida

Procedimiento: Eliminacin de elemento en Pila


Algoritmo
Eliminar(Pila, Cima, Elemento)
1. [Pila Vaca?]
Si Cima = -1, entonces:
Escribe: Subdesbordamiento (Underflow)
2. Elemento = Pila[Cima]
3. Cima = Cima - 1
codigo
void CmdEliminarClick(object sender, EventArgs e)
{
if (frmPrincipal.Cima == -1)
{
MessageBox.Show("Pila Vacia (Underflow)");
return;

}
string Elemento = frmPrincipal.Pila[frmPrincipal.Cima];
frmPrincipal.Cima = frmPrincipal.Cima - 1;
lsEliminados.Items.Add(Elemento);
}
Corrida

- See more at:


http://www.programacionfacil.com/estructura_datos_csharp/pilas#sthash.7ND1Hohh.dpu
f