Stack C# con esempi Push & Pop

โšก Riepilogo intelligente

In C#, lo stack รจ una collezione dello spazio dei nomi System.Collections che segue il principio LIFO (Last In, First Out), in cui il metodo Push aggiunge un elemento in cima e il metodo Pop lo rimuove.

  • ๐Ÿ“š Concetto LIFO: Una pila funziona come una pila di libri, quindi l'ultimo elemento spinto รจ il primo a essere rimosso.
  • โž• Spingi e fai scoppiare: Il metodo Push aggiunge un elemento in cima allo stack, mentre il metodo Pop rimuove e restituisce l'elemento in cima.
  • ๐Ÿ‘€ Dai un'occhiata, conta, contiene: Il metodo Peek legge l'elemento superiore senza rimuoverlo, mentre Count e Contains segnalano la dimensione e l'appartenenza.
  • ๐Ÿงช Esempi pratici: Due programmi console dimostrano Push con Count e Contains, quindi Pop in modo da poter trace l'ordine LIFO.
  • ๏ธ Stack generico: La pila La classe in System.Collections.Generic aggiunge sicurezza dei tipi in fase di compilazione ed evita il boxing per il nuovo codice C#.
  • ๐Ÿค– Assistenza AI: GitHub Copilot genera automaticamente le operazioni sullo stack in C#, e ML.NET legge i dati tramite collezioni tipizzate anzichรฉ tramite uno stack non generico.

Pila C#

Cos'รจ lo Stack in C#?

Lo stack รจ una raccolta di casi speciali che rappresenta il concetto LIFO (last in first out). Per comprendere innanzitutto il LIFO, facciamo un esempio. Immagina una pila di libri con ogni libro tenuto uno sopra l'altro.

Il concetto di last in first out nel caso dei libri significa che solo il libro piรน in alto puรฒ essere rimosso dalla pila di libri. Non รจ possibile rimuovere un libro dal centro perchรฉ ciรฒ disturberebbe l'impostazione della pila.

Quindi in C#, anche lo stack funziona allo stesso modo. Gli elementi vengono aggiunti alla pila, uno sopra l'altro. Il processo di aggiunta di un elemento allo stack รจ chiamato operazione push. Per rimuovere un elemento da una pila, puoi anche rimuovere l'elemento piรน in alto della pila. Questa operazione รจ nota come pop.

Diamo un'occhiata piรน in dettaglio alle operazioni disponibili per la raccolta Stack.

Dichiarazione dello stack

Uno stack viene creato con l'aiuto del tipo Stack Data. La parola chiave โ€œnewโ€ viene utilizzata per creare un oggetto di uno Stack. L'oggetto viene quindi assegnato alla variabile st.

Stack st = new Stack()

Aggiunta di elementi allo stack

Il metodo push viene utilizzato per aggiungere un elemento allo stack. La sintassi generale dell'enunciato รจ riportata di seguito.

Stack.push(element)

Rimozione di elementi dalla pila

Il metodo pop viene utilizzato per rimuovere un elemento dallo stack. L'operazione pop restituirร  l'elemento piรน in alto dello stack. La sintassi generale dell'enunciato รจ riportata di seguito

 Stack.pop()

Contare

Questa proprietร  viene utilizzata per ottenere il numero di elementi nello Stack. Di seguito รจ riportata la sintassi generale di questa istruzione.

Stack.Count

contiene

Questo metodo viene utilizzato per vedere se un elemento รจ presente nello Stack. Di seguito รจ riportata la sintassi generale di questa istruzione. L'istruzione restituirร  true se l'elemento esiste, altrimenti restituirร  il valore false.

Stack.Contains(element)

Ora vediamolo funzionare a livello di codice. Tutto il codice sotto indicato verrร  scritto al ns Applicazione console. Il codice verrร  scritto nel nostro file Program.cs.

Nel programma seguente, scriveremo il codice per vedere come possiamo utilizzare i metodi sopra menzionati.

Esempio 1: metodo Stack.Push()

In questo esempio vedremo

  • Come viene creato uno stack.
  • Come visualizzare gli elementi dello stack e utilizzare i metodi Count e Contain.

Impila in 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 Spiegazione:-

  1. Il primo passo viene utilizzato per dichiarare lo Stack. Qui stiamo dichiarando "st" come variabile per contenere gli elementi del nostro stack.
  2. Successivamente, aggiungiamo 3 elementi al nostro stack. Ogni elemento viene aggiunto tramite il metodo Push.
  3. Ora, poichรฉ non รจ possibile accedere agli elementi dello stack tramite la posizione dell'indice come il lista di array, dobbiamo utilizzare un approccio diverso per visualizzare gli elementi dello stack. L'Oggetto (obj) รจ una variabile temporanea, dichiarata per contenere ogni elemento dello stack. Utilizziamo quindi l'istruzione foreach per esaminare ogni elemento dello stack. Per ogni elemento dello stack, il valore viene assegnato alla variabile obj. Utilizziamo quindi il comando Console.Writeline per visualizzare il valore sulla console.
  4. Stiamo utilizzando la proprietร  Count (st.count) per ottenere il numero di elementi nello stack. Questa proprietร  restituirร  un numero. Quindi visualizziamo questo valore sulla console.
  5. Utilizziamo quindi il metodo Contiene per vedere se il valore 3 รจ presente nel nostro stack. Ciรฒ restituirร  un valore vero o falso. Quindi visualizziamo questo valore restituito sulla console.

Se il codice sopra riportato viene inserito correttamente e il programma viene eseguito, verrร  visualizzato il seguente output.

Produzione:

Impila in C#

Dall'output, possiamo vedere che vengono visualizzati gli elementi dello stack. Inoltre, viene visualizzato il valore True per indicare che il valore 3 รจ definito nello stack.

Note:: Hai notato che l'ultimo elemento messo nello stack viene visualizzato per primo. Questo รจ l'elemento piรน in alto dello stack. Nell'output viene mostrato anche il conteggio degli elementi dello stack.

Esempio 2: metodo Stack.Pop()

Ora diamo un'occhiata alla funzionalitร  "rimuovi". Vedremo il codice richiesto per rimuovere l'elemento piรน in alto dallo stack.

Impila in 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 Spiegazione:-

  1. Qui utilizziamo semplicemente il metodo pop che viene utilizzato per rimuovere un elemento dallo stack.

Se il codice sopra riportato viene immesso correttamente e il programma viene eseguito, verrร  visualizzato il seguente output.

Produzione:

Impila in C#

Possiamo vedere che l'elemento 3 รจ stato rimosso dallo stack.

Metodo Stack Peek() di C#

I metodi Push e Pop operano sulla cima dello stack, ma a volte รจ necessario visualizzare solo l'elemento in cima senza rimuoverlo. Il metodo Peek fa proprio questo: restituisce il valore piรน in alto nello stack lasciando la collezione invariata, il che รจ utile quando si desidera testare l'elemento successivo prima di decidere di estrarlo.

Passo 1) Crea una pila e inserisci tre elementi al suo interno, in modo che il valore 3 si trovi in โ€‹โ€‹cima.

Passo 2) Richiama il metodo Peek per leggere l'elemento in cima all'elenco, quindi controlla la proprietร  Count per verificare che non sia stato rimosso nulla.

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 Spiegazione:-

  1. Viene dichiarato uno stack chiamato st e i valori 1, 2 e 3 vengono aggiunti con il metodo Push, in modo che 3 diventi l'elemento in cima.
  2. Il metodo Peek restituisce l'elemento in cima senza rimuoverlo, e la proprietร  Count continua a riportare il numero totale di elementi nello stack.

Quando il programma viene eseguito, stampa il valore 3 da Peek e poi il conteggio 3, che dimostra che l'elemento rimane nello stack. Se lo stack รจ vuoto, Peek genera un InvalidOperationException, quindi รจ sicuro controllare Count prima di chiamarlo.

Stack generico in C#

Gli esempi precedenti utilizzano la classe Stack non generica di System.Collections, che memorizza ogni elemento come un oggetto. Il codice C# moderno di solito preferisce la classe Stack generica. Classe dello spazio dei nomi System.Collections.Generic. Collega lo stack a un singolo tipo dichiarato, quindi il compilatore controlla ogni operazione di Push e Pop e non รจ necessario alcun casting o boxing.

I principali vantaggi dello Stack generico sono elencati di seguito.

  • Tipo di sicurezza: Il tipo รจ definito al momento della dichiarazione, quindi possono essere inseriti solo valori di quel tipo e gli errori vengono rilevati in fase di compilazione.
  • Niente boxe: I tipi valore come int vengono memorizzati direttamente, evitando cosรฌ il costo di boxing che si verifica con lo Stack non generico.
  • Il pulitore legge: Pop e Peek restituiscono direttamente il tipo dichiarato, quindi non รจ necessario effettuare un cast del risultato da 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();
  }
 }
}

In questo esempio lo stack รจ dichiarato come Stack , quindi accetta solo valori stringa. Il metodo Pop restituisce direttamente una stringa e stampa Python, l'ultimo valore inserito. Per ogni nuovo progetto, lo Stack generico รจ la scelta consigliata.

Differenza tra stack e coda in C#

Una pila e un fare la coda Sono entrambe collezioni che controllano l'ordine in cui gli elementi vengono rimossi, ma utilizzano regole opposte. Uno stack รจ last in, first out (ultimo entrato, primo uscito), mentre una coda รจ first in, first out (primo entrato, primo uscito). Scegliere quella giusta rende chiaro l'intento del codice agli altri sviluppatori.

Le principali differenze sono elencate di seguito:

  • Ordine: Una pila rimuove prima l'elemento aggiunto piรน di recente (LIFO), mentre una coda rimuove prima l'elemento piรน vecchio (FIFO).
  • Metodi: Uno stack utilizza le operazioni Push e Pop, mentre una coda utilizza Enqueue per aggiungere e Dequeue per rimuovere.
  • Accesso all'elemento superiore: Una pila legge il suo elemento successivo con Peek, mentre una coda legge il suo elemento successivo con Peek dalla parte anteriore.
  • Usi tipici: Gli stack includono funzionalitร  di annullamento, valutazione delle espressioni e ricorsione. tracre, mentre le code si adattano alla pianificazione, al buffering e all'attraversamento in ampiezza.

Entrambi i tipi sono disponibili in forma generica come Stack e coda in System.Collections.Generic, quindi si ottiene la sicurezza dei tipi con entrambe le scelte.

DOMANDE FREQUENTI

La chiamata a Pop o Peek su uno stack vuoto genera un InvalidOperationException. Controllare prima la proprietร  Count oppure utilizzare i metodi generici dello Stack TryPop e TryPeek, che restituiscono false invece di generare un'eccezione quando lo stack non contiene elementi.

Le operazioni Push e Pop hanno entrambe una complessitร  temporale costante O(1) perchรฉ accedono solo alla cima dello stack. Quando l'array interno deve espandersi, un'occasionale operazione Push lo ridimensiona, ma il costo medio per operazione rimane costante.

No. Uno stack espone solo la sua cima tramite Peek e Pop, quindi non ha un accesso tramite indice come una lista. Per leggere ogni valore, scorri lo stack con un ciclo foreach oppure copialo usando il metodo ToArray.

Il metodo Clear rimuove tutti gli elementi dallo stack in una sola chiamata e reimposta Count a zero. Per rimuovere gli elementi uno alla volta dall'alto, invece, chiama Pop in un ciclo finchรฉ Count non raggiunge zero.

La classe Stack standard non รจ thread-safe per le operazioni di scrittura quando piรน thread la modificano contemporaneamente. Per l'accesso concorrente, utilizzare ConcurrentStack di System.Collections.Concurrent, che offre metodi atomici TryPush e TryPop senza blocchi esterni.

Chiama il metodo ToArray per copiare lo stack in un nuovo array, ordinato dall'alto verso il basso. Puoi anche passare lo stack a un costruttore List per costruire una lista generica mantenendoping lo stesso ordine.

Sรฌ. GitHub Copilot scrive dichiarazioni Stack, chiamate Push e Pop e cicli foreach a partire da un breve commento o dal nome di un metodo. Spesso suggerisce la versione generica di Stack, poichรฉ รจ la raccolta consigliata per il nuovo codice C#.

Gli stack raramente memorizzano i dati di training di ML.NET, che fluiscono attraverso raccolte tipizzate e la pipeline IDataView. Tuttavia, il concetto di stack LIFO appare all'interno degli algoritmi di machine learning per il backendtracre, ricerca in profonditร  e gestione delle chiamate di metodo ricorsive.

Riassumi questo post con: