C# Pila (Stack)
En C#, la pila (Stack) es una estructura de datos de tipo último en entrar, primero en salir (LIFO, Last In First Out).
La pila (Stack) es adecuada para almacenar y procesar datos en orden, donde el elemento añadido más recientemente se elimina primero.
La pila (Stack) representa unacolección de objetos LIFO (último en entrar, primero en salir).Cuando necesite acceder a los elementos en orden LIFO, utilice una pila. Cuando agrega un elemento a la lista, se denominaempujar (push)elemento; cuando elimina un elemento de la lista, se denominapop (extraer)elemento.
Stack ofrece dos formas de implementación:
- No genérico
Stack(System.Collections.Stack): admite almacenar objetos de cualquier tipo (requiere operaciones de boxing y unboxing). - Genérico
Stack<T>(System.Collections.Generic.Stack<T>): admite objetos fuertemente tipados, evita boxing y unboxing y mejora el rendimiento.
Características de Stack:
- LIFO (último en entrar, primero en salir): el último elemento empujado a la pila es el primero en salir.
- Tamaño dinámico: la capacidad de la pila se ajusta dinámicamente según sea necesario.
- Soporte de genéricos: a través de
Stack<T>proporciona seguridad de tipos, evitando errores de conversión de tipos. - No es seguro para subprocesos: de forma predeterminada,
StackyStack<T>no son seguros para subprocesos.
Métodos y propiedades de la clase Stack
La siguiente tabla enumeraStackalgunas de las propiedades de uso común de laclase Stack.:
| Nombre de la propiedad | Tipo | Descripción |
|---|---|---|
Count | int | Obtiene el número de elementos de la pila. |
SyncRoot | object | Obtiene un objeto para sincronizar el acceso a la pila (no genérico). |
IsSynchronized | bool | Indica si el acceso a la pila está sincronizado (seguro para subprocesos; siempre esfalse)。 |
La siguiente tabla enumeraStackalgunos de los métodos de uso común de laclase Stack.:
| Nombre del método | Tipo de retorno | Descripción |
|---|---|---|
| Operaciones con elementos | ||
Push(object item) | void | Empuja un elemento a la parte superior de la pila. |
Pop() | object | Elimina y devuelve el elemento de la parte superior de la pila. |
Peek() | object | Devuelve el elemento de la parte superior de la pila sin eliminarlo. |
Clear() | void | Elimina todos los elementos de la pila. |
| Comprobación y copia | ||
Contains(object item) | bool | Determina si un elemento existe en la pila. |
ToArray() | object[] | Copia los elementos de la pila en una nueva matriz (con el orden invertido). |
Clone() | object | Crea una copia superficial de la pila actual. |
CopyTo(Array array, int index) | void | Copia los elementos de la pila en una matriz existente, comenzando en el índice especificado. |
| Compatibilidad con enumeradores | ||
GetEnumerator() | IEnumerator | Devuelve un enumerador para recorrer los elementos de la pila. |
| Seguridad para subprocesos | ||
Synchronized(Stack stack) | Stack | Devuelve un contenedor de pila seguro para subprocesos. |
Ejemplo
El siguiente ejemplo demuestra el uso de la pila (Stack).
Pila no genérica:
Ejemplo
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Stack st = new Stack();
st.Push('A');
st.Push('M');
st.Push('G');
st.Push('W');
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
st.Push('V');
st.Push('H');
Console.WriteLine("The next poppable value in stack: {0}",
st.Peek());
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
Console.WriteLine("Removing values ");
st.Pop();
st.Pop();
st.Pop();
Console.WriteLine("Current stack: ");
foreach (char c in st)
{
Console.Write(c + " ");
}
}
}
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:
Current stack: W G M A The next poppable value in stack: H Current stack: H V W G M A Removing values Current stack: G M A
Pila genérica:
Ejemplo
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<int> stack = new Stack<int>();
// Empujar
stack.Push(10);
stack.Push(20);
stack.Push(30);
// Ver la parte superior de la pila
Console.WriteLine($"Peek: {stack.Peek()}"); // Salida: 30
// Pop
Console.WriteLine($"Pop: {stack.Pop()}"); // Salida: 30
// Pila restante
Console.WriteLine("Remaining items:");
foreach (var item in stack)
{
Console.WriteLine(item); // Salida: 20, 10
}
}
}
Diferencia entre Stack y Stack<T>
Stack (no genérico)
- Almacena objetos de tipo
objectObject. - Al usarla, se requiere una conversión de tipos explícita, lo que puede provocar excepciones en tiempo de ejecución.
Stack<T> (genérico)
- Proporciona seguridad de tipos, evitando problemas de conversión de tipos.
- Rendimiento superior, ya que evita la sobrecarga de boxing y unboxing.
Colecciones en C#