Estructuras de C#. Pila (Stack)

Jul 18, 2009 Codigos C# 12 comentarios

Esta estructura es bastante usada para simular métodos recursivos y resolver algunos tipos de problemas. Esto viene simulando como un montón de objetos que se van apilando (uno encima de otro). La filosofía de una pila (stack) es “El último que entra es el primero que sale”. Pueden ver un poco más de que se trata en la figura.
Stack Estructuras de C#. Pila (Stack)
Es importante también señalar que esta clase implementa la interfaz IEnumerable.

Una pila tiene un constructor con tres sobre cargas:

Contructor por defecto que crea una pila vacía

Stack s = new Stack();

Podemos indicar la cantidad inicial de elementos que tendrá la pila

Stack s = new Stack(int initialCapacity);

Podemos también pasarle una colección de elementos (List, Quee, ArrayList). Este constructor copiará todos estos elementos a la pila iniciará

Stack s = new Stack(ICollection col);

Además de los métodos de la interfaz ICollection (Contains, Remove, GetEnumerator, etc), encontramos básicamente 3 métodos que explico ahora:

public T Peek()
//Retorna el último elemento que se agregó en la pila.
 
public object Pop()
// Retorna el último elemento de la pila al igual que Peek(), pero elimina dicho elemento de la pila una vez devuelto.
 
public void Push(object x)
//Agrega un nuevo elemento a la pila

Ahora veamos la implementación de la clase Pila (Stack) de CSharp:

public class Pila: IEnumerable
{
 
      class Node 
     {
          public T value;
          public Node next;
          public Node(T value, Node next)
          {
              this.value=value;
              this.next=next;
          }
     }
 
    Node primero;
    int cambios;
    int contador
 
    //El constructor
    public Pila()
    {
        contador=0;
        cambios=0;
    }
 
public T Peek()
{
     if(count<=0)
         throw new InvalidOperationException("La pila esta vacia");
     return primero.value;
}
 
public T Pop()
{
     T temp=primero.value;
     primero=primero.next;
     contador--;
     cambios++;
     return temp;
}
 
public void Push(T x)
{
    if(primero==null)
        primero= new Node(x);
    else
    {
        primero=new Node(x,primero);
        cambios++;
        contador++;
    }
}
 
public int Count
{
    get{
       return contador;
   }
}
 
public bool Contiene(T x)
{
    Node temp= primero;
    for(int i=0; i
 
Por supuesto, le faltan algunos métodos de la interfaz ICollection, pero esos ya los vimos cuando hablamos de <a href="http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/" target="_blank"> la clase LinkedNode en C# y la Interfaz Ilist.</a>
 
También implementé esta clase usando <a href="http://www.puntopeek.com/codigos-c/la-clase-linkednode-en-c-interfaz-ilist/" target="_blank">nodos enlazables</a>, pero por supuesto sería mucho más sencillo con arrays o listas...
 
Si tienen alguna duda o creen que falta algo, ya saben, comenten...
 
Proximamente hablaremos de otras dos estructuras (colas, lista generica) y de genericidad.
 
<strong> PD. Este post ha sido modificado, para añadirle a la clase el soporte de genericiad</strong>

Compartir:

12 comentarios

Forma parte de nuestra discusión y síguela de cerca

[...] opción (pero hay que conocer que es una pila), es ir guardando cada letra en una pila (stack), y luego cuando esten todas las letras las sacamos [...]

Autor: Tres formas de Invertir un String | PuntoPeek.com | Fecha: Oct 3, 2009.

Podrias poner todo el codigo para poder entender bien el tema ??? viendolo paso por paso??

Autor: Mario | Fecha: Feb 16, 2011.

Oye y tu no sabes como usar la librería Math, es que por lo menos quisiera saber como sacar una raíz cuadrada en consola.

Autor: Gustavo Delgado | Fecha: Mar 22, 2011.

Gustavo, para usar la librería Math, solo tienes que añadir la siguiente línea en la parte superior, junto con otros namespaces:

using System.Math;

Ya después podrás usar métodos como Sqrt para la raiz cuadrada, Pow para elevar al cuadrado y más.

Autor: Tomy | Fecha: Mar 23, 2011.

Disculpa, veo que usas una lista enlazada para la pila, ¿puedo enviarte mi clase pila que implementa un arreglo?

Autor: Isaac Robles García | Fecha: Abr 6, 2011.

Claro, compártela con nosotros, aunque es mucho más eficiente usar una lista enlazable, porque el array permite un número limitado de elementos y cuando este se llene, hay que crear un array más grande y copiar todos los elementos a este nuevo array, lo cual consume un tiempo considerable.

Autor: Tomy | Fecha: Abr 10, 2011.

Ayuda quisiera que me pasasen un enunciado el cual se pueda solucionar total o parcialmente con estructuras pilas y si es posible su codigo alguien que tenga un archivo por alli guardado. se los agradecere.

Autor: YAMUSHA | Fecha: May 16, 2011.

disculpa tengo una duda en tu codigo
que significa:
i&lt
count<
y como pongo esto:
Node primero;
por que en c· no me da la opcion de node :S
Gracias de Antemano

Autor: Christian | Fecha: Oct 18, 2011.

@Christian: los caracteres raros es la codificación para el signo < , ya está arreglado. Por otro lado, C# no cuenta con la clase Node, habría que crearla, y sería algo así, aprovechando ya la genericidad para que la pila sea de cualquier tipo de dato. Además aproveché y actualicé el post sobre todo con algunos cambios para hacer que la Pila sea genérica, o sea, que podemos hacer cosas como

 Pila p = new Pila<string>();

y de esta forma quedará claro que la pila va a ser de objetos de tipo string.

class Node <T>
{
      public T value;
      public Node next;
      public Node(T value, Node next)
     {
            this.value=value;
            this.next=next;
     }
}

Autor: Tomy | Fecha: Oct 19, 2011.

Disculpa gustavo por favor podrías mostrarme una estructura de la pila y su funcionamiento cuando entran y salen datos?

Autor: michell aranza | Fecha: Jun 5, 2012.

Cabe mencionar que como autor de este post se debió hacer mención de los 2 tipos de pilas, en tu caso me parece que manejas una pila dinámica y otros usuarios implementan pilas con arreglos (Pilas estáticas) y me parece erróneo tu comentario afirmando que las pilas dinámicas son mejores dado que en algunas situaciones adquiere ventaja y en otras es mejor manejar pilas estáticas. Haciendo esta mención evitamos la confusión de muchos usuarios nuevos en el campo de las estructuras de datos.

Autor: Alejandro Reyes | Fecha: Sep 23, 2016.

@AlejandroReyes, tienes toda la razón, gracias por la nota.

Autor: Tomy | Fecha: Nov 22, 2016.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.