Pila de C# con ejemplos Push & Pop

โšก Resumen inteligente

En C#, una pila es una colecciรณn del espacio de nombres System.Collections que sigue el principio de รบltimo en entrar, primero en salir (LIFO), donde el mรฉtodo Push agrega un elemento a la parte superior y el mรฉtodo Pop lo elimina.

  • ๐Ÿ“š Concepto LIFO: Una pila funciona como un montรณn de libros, por lo que el รบltimo elemento que se agrega es el primero que se elimina.
  • โž• Empujar y hacer estallar: El mรฉtodo Push agrega un elemento a la parte superior de la pila, y el mรฉtodo Pop elimina y devuelve ese elemento superior.
  • ๐Ÿ‘€ Mira, cuenta, contiene: El mรฉtodo Peek lee el elemento superior sin eliminarlo, mientras que Count y Contains informan sobre el tamaรฑo y la pertenencia a un grupo.
  • ๐Ÿงช Ejemplos resueltos: Dos programas de consola demuestran Push con Count y Contains, y luego Pop, para que puedas tracy el orden LIFO.
  • ๐Ÿ› ๏ธ Pila genรฉrica: La pila La clase en System.Collections.Generic agrega seguridad de tipos en tiempo de compilaciรณn y evita el empaquetado para el nuevo cรณdigo C#.
  • ๐Ÿค– Asistencia de IA: GitHub Copilot genera la estructura bรกsica de las operaciones de pila de C#, y ML.NET lee los datos a travรฉs de colecciones tipadas en lugar de una pila no genรฉrica.

Pila de C#

ยฟQuรฉ es la pila en C#?

La pila es una colecciรณn de casos especiales que representa un concepto de รบltimo en entrar, primero en salir (LIFO). Para entender primero LIFO, tomemos un ejemplo. Imagine una pila de libros con cada libro uno encima del otro.

El concepto de รบltimo en entrar, primero en salir en el caso de los libros significa que sรณlo el libro que estรก mรกs arriba se puede quitar de la pila de libros. No es posible quitar un libro de entre medio, porque eso perturbarรญa la colocaciรณn de la pila.

Por lo tanto en C#, la pila tambiรฉn funciona de la misma manera. Los elementos se agregan a la pila, uno encima del otro. El proceso de agregar un elemento a la pila se llama operaciรณn de inserciรณn. Para eliminar un elemento de una pila, tambiรฉn puede eliminar el elemento superior de la pila. Esta operaciรณn se conoce como pop.

Veamos con mรกs detalle las operaciones disponibles para la colecciรณn Stack.

Declaraciรณn de la pila

Se crea una pila con la ayuda del tipo Stack Data. La palabra clave "nuevo" se utiliza para crear un objeto de una pila. Luego, el objeto se asigna a la variable st.

Stack st = new Stack()

Agregar elementos a la pila

El mรฉtodo push se utiliza para agregar un elemento a la pila. La sintaxis general de la declaraciรณn se proporciona a continuaciรณn.

Stack.push(element)

Quitar elementos de la pila

El mรฉtodo pop se utiliza para eliminar un elemento de la pila. La operaciรณn pop devolverรก el elemento superior de la pila. La sintaxis general de la declaraciรณn se proporciona a continuaciรณn.

 Stack.pop()

Contar

Esta propiedad se utiliza para obtener la cantidad de elementos en la pila. A continuaciรณn se muestra la sintaxis general de esta declaraciรณn.

Stack.Count

Contiene

Este mรฉtodo se utiliza para ver si un elemento estรก presente en la pila. A continuaciรณn se muestra la sintaxis general de esta declaraciรณn. La declaraciรณn devolverรก verdadero si el elemento existe; de โ€‹โ€‹lo contrario, devolverรก el valor falso.

Stack.Contains(element)

Ahora veamos cรณmo funciona esto a nivel de cรณdigo. Todo el cรณdigo mencionado a continuaciรณn se escribirรก en nuestro Aplicaciรณn de consola. El cรณdigo se escribirรก en nuestro archivo Program.cs.

En el siguiente programa, escribiremos el cรณdigo para ver cรณmo podemos utilizar los mรฉtodos mencionados anteriormente.

Ejemplo 1: Mรฉtodo Stack.Push()

En este ejemplo veremos

  • Cรณmo se crea una pila.
  • Cรณmo mostrar los elementos de la pila y utilizar los mรฉtodos Count y Contain.

Apilar en C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.WriteLine(); Console.WriteLine();
    Console.WriteLine("The number of elements in the stack " +st.Count);
    Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3));
    Console.ReadKey();
  }
 }
}

Code Explicaciรณn:-

  1. El primer paso se utiliza para declarar la pila. Aquรญ declaramos "st" como una variable para contener los elementos de nuestra pila.
  2. A continuaciรณn, agregamos 3 elementos a nuestra pila. Cada elemento se agrega mediante el mรฉtodo Push.
  3. Ahora bien, dado que no se puede acceder a los elementos de la pila a travรฉs de la posiciรณn del รญndice como el lista de arreglo, necesitamos utilizar un enfoque diferente para mostrar los elementos de la pila. El Objeto (obj) es una variable temporal, que se declara para contener cada elemento de la pila. Luego usamos la declaraciรณn foreach para revisar cada elemento de la pila. Para cada elemento de la pila, el valor se asigna a la variable obj. Luego usamos el comando Console.Writeline para mostrar el valor en la consola.
  4. Estamos usando la propiedad Count (st.count) para obtener la cantidad de elementos en la pila. Esta propiedad devolverรก un nรบmero. Luego mostramos este valor en la consola.
  5. Luego usamos el mรฉtodo Contiene para ver si el valor de 3 estรก presente en nuestra pila. Esto devolverรก un valor verdadero o falso. Luego mostramos este valor de retorno en la consola.

Si el cรณdigo anterior se ingresa correctamente y se ejecuta el programa, se mostrarรก el siguiente resultado.

Salida:

Apilar en C#

En el resultado, podemos ver que se muestran los elementos de la pila. Ademรกs, se muestra el valor de Verdadero para indicar que el valor de 3 estรก definido en la pila.

Nota: :Has notado que el รบltimo elemento insertado en la pila se muestra primero. Este es el elemento superior de la pila. La cantidad de elementos de la pila tambiรฉn se muestra en la salida.

Ejemplo 2: Mรฉtodo Stack.Pop()

Ahora veamos la funcionalidad "eliminar". Veremos el cรณdigo necesario para eliminar el elemento superior de la pila.

Apilar en C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   
   st.Pop();

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.ReadKey();
  }
 }
}

Code Explicaciรณn:-

  1. Aquรญ simplemente emitimos el mรฉtodo pop que se utiliza para eliminar un elemento de la pila.

Si el cรณdigo anterior se ingresa correctamente y se ejecuta el programa, se mostrarรก el siguiente resultado.

Salida:

Apilar en C#

Podemos ver que el elemento 3 fue eliminado de la pila.

Mรฉtodo Stack Peek() de C#

Los mรฉtodos Push y Pop trabajan con el elemento superior de la pila, pero a veces solo necesitas ver el elemento superior sin eliminarlo. El mรฉtodo Peek hace precisamente eso. Devuelve el valor superior de la pila sin modificar la colecciรณn, lo cual es รบtil cuando quieres comprobar el siguiente elemento antes de decidir eliminarlo.

Paso 1) Crea una pila y agrega tres elementos a ella, de modo que el valor 3 quede en la parte superior.

Paso 2) Llama al mรฉtodo Peek para leer el elemento superior y, a continuaciรณn, comprueba la propiedad Count para confirmar que no se ha eliminado nada.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   Console.WriteLine(st.Peek());
   Console.WriteLine(st.Count);
   Console.ReadKey();
  }
 }
}

Code Explicaciรณn:-

  1. Se declara una pila llamada st, y se agregan los valores 1, 2 y 3 con el mรฉtodo Push, de modo que 3 se convierte en el elemento superior.
  2. El mรฉtodo Peek devuelve el elemento superior sin eliminarlo, y la propiedad Count sigue informando del nรบmero total de elementos en la pila.

Cuando se ejecuta el programa, imprime el valor. 3 desde Peek y luego el recuento 3, lo que demuestra que el elemento permanece en la pila. Si la pila estรก vacรญa, Peek lanza una excepciรณn Invalid.OperationException, por lo que es seguro comprobar Count antes de llamarla.

Pila genรฉrica Cยช#

Los ejemplos anteriores utilizan la clase Stack no genรฉrica de System.Collections, que almacena cada elemento como un objeto. El cรณdigo C# moderno generalmente prefiere la clase Stack genรฉrica. Clase del espacio de nombres System.Collections.Generic. Vincula la pila a un รบnico tipo declarado, por lo que el compilador comprueba cada operaciรณn Push y Pop y no se necesita conversiรณn ni empaquetado.

Las principales ventajas de la pila genรฉrica se enumeran a continuaciรณn.

  • Seguridad de tipos: El tipo se fija en la declaraciรณn, por lo que solo se pueden insertar valores de ese tipo, y los errores se detectan en tiempo de compilaciรณn.
  • No se permite el boxeo: Los tipos de valor como int se almacenan directamente, lo que evita el coste de empaquetado que supone la pila no genรฉrica.
  • El limpiador lee: Pop y Peek devuelven directamente el tipo declarado, por lo que no es necesario convertir el resultado de nuevo desde object.
using System;
using System.Collections.Generic;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack<string> st = new Stack<string>();
   st.Push("Java");
   st.Push("Python");
   Console.WriteLine(st.Pop());
   Console.ReadKey();
  }
 }
}

En este ejemplo, la pila se declara como Stack , por lo que solo acepta valores de cadena. El mรฉtodo Pop devuelve una cadena directamente y la imprime. Python, el รบltimo valor insertado. Para cualquier proyecto nuevo, la pila genรฉrica es la opciรณn recomendada.

Diferencia entre pila y cola en C#

Una pila y una cola Ambas son colecciones que controlan el orden en que se eliminan los elementos, pero utilizan reglas opuestas. Una pila funciona segรบn el principio de รบltimo en entrar, primero en salir, mientras que una cola funciona segรบn el principio de primero en entrar, primero en salir. Elegir la correcta deja clara la intenciรณn del cรณdigo para otros desarrolladores.

Las principales diferencias se enumeran a continuaciรณn:

  • Orden: Una pila elimina primero el elemento aรฑadido mรกs recientemente (LIFO), mientras que una cola elimina primero el elemento mรกs antiguo (FIFO).
  • Mรฉtodos: Una pila utiliza Push y Pop, mientras que una cola utiliza Enqueue para agregar y Dequeue para eliminar.
  • Acceso al elemento superior: Una pila lee su siguiente elemento con Peek, y una cola lee su siguiente elemento con Peek desde el frente.
  • Usos tipicos: Las pilas se adaptan a las funciones de deshacer, la evaluaciรณn de expresiones y la recursiรณn. tracrey, mientras que las colas se adaptan a la programaciรณn, el almacenamiento en bรบfer y el recorrido en amplitud.

Ambos tipos estรกn disponibles en forma genรฉrica como Stack y cola en System.Collections.Generic, por lo que se obtiene seguridad de tipos con cualquiera de las dos opciones.

Preguntas Frecuentes

Llamar a Pop o Peek en una pila vacรญa genera un error Invalid.OperationException. Compruebe primero la propiedad Count o utilice los mรฉtodos genรฉricos de Stack TryPop y TryPeek, que devuelven false en lugar de lanzar una excepciรณn cuando la pila no contiene elementos.

Tanto Push como Pop se ejecutan en tiempo constante O(1) porque solo acceden a la parte superior de la pila. Cuando el arreglo interno necesita crecer, un Push ocasional lo redimensiona, pero el costo promedio por operaciรณn permanece constante.

No. Una pila solo expone su elemento superior mediante las funciones Peek y Pop, por lo que no tiene un mรฉtodo de acceso por รญndice como una lista. Para leer todos los valores, recorra la pila con un bucle foreach o cรณpiela usando el mรฉtodo ToArray.

El mรฉtodo Clear elimina todos los elementos de la pila en una sola llamada y restablece Count a cero. Para eliminar los elementos uno por uno desde la parte superior, llama a Pop en un bucle hasta que Count llegue a cero.

La clase Stack estรกndar no es segura para escrituras cuando varios subprocesos la modifican simultรกneamente. Para el acceso concurrente, utilice ConcurrentStack de System.Collections.Concurrent, que ofrece mรฉtodos TryPush y TryPop atรณmicos sin bloqueos externos.

Llama al mรฉtodo ToArray para copiar la pila en una nueva matriz, ordenada de arriba a abajo. Tambiรฉn puedes pasar la pila a un constructor de List para construir una lista genรฉrica mientras mantienesping el mismo orden.

Sรญ. GitHub Copilot escribe declaraciones de pila, llamadas a push y pop, y bucles foreach a partir de un comentario breve o el nombre de un mรฉtodo. Con frecuencia sugiere la versiรณn genรฉrica de pila, ya que es la colecciรณn recomendada para el cรณdigo C# nuevo.

Las pilas rara vez almacenan datos de entrenamiento de ML.NET, que fluyen a travรฉs de colecciones tipadas y la canalizaciรณn IDataView. Sin embargo, el concepto de pila LIFO aparece dentro de los algoritmos de aprendizaje automรกtico para retroalimentar.tracrey, bรบsqueda en profundidad y gestiรณn de llamadas a mรฉtodos recursivos.

Resumir este post con: