C# Pila (Stack)

C# 集合Colecciones en C#

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:

  1. No genéricoStack(System.Collections.Stack): admite almacenar objetos de cualquier tipo (requiere operaciones de boxing y unboxing).
  2. GenéricoStack<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 deStack<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 propiedadTipoDescripción
CountintObtiene el número de elementos de la pila.
SyncRootobjectObtiene un objeto para sincronizar el acceso a la pila (no genérico).
IsSynchronizedboolIndica si el acceso a la pila está sincronizado (seguro para subprocesos; siempre esfalse)。
td>Obtiene el número de elementos contenidos en Stack.

La siguiente tabla enumeraStackalgunos de los métodos de uso común de laclase Stack.:

Nombre del métodoTipo de retornoDescripción
Operaciones con elementos
Push(object item)voidEmpuja un elemento a la parte superior de la pila.
Pop()objectElimina y devuelve el elemento de la parte superior de la pila.
Peek()objectDevuelve el elemento de la parte superior de la pila sin eliminarlo.
Clear()voidElimina todos los elementos de la pila.
Comprobación y copia
Contains(object item)boolDetermina si un elemento existe en la pila.
ToArray()object[]Copia los elementos de la pila en una nueva matriz (con el orden invertido).
Clone()objectCrea una copia superficial de la pila actual.
CopyTo(Array array, int index)voidCopia los elementos de la pila en una matriz existente, comenzando en el índice especificado.
Compatibilidad con enumeradores
GetEnumerator()IEnumeratorDevuelve un enumerador para recorrer los elementos de la pila.
Seguridad para subprocesos
Synchronized(Stack stack)StackDevuelve 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;
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;
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 tipoobjectObject.
  • 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.

C# 集合Colecciones en C#

Otras extensiones