Storia della domanda:
Le collezioni Queue e Stack sono strutture dati di base che implementano rispettivamente i principi FIFO (First-In-First-Out) e LIFO (Last-In-First-Out). Sono utilizzate attivamente sin dai tempi del classico VB6, e con l'arrivo di VB.NET queste strutture sono diventate classi standard. Queue è utile per scenari in cui gli elementi devono essere elaborati nell'ordine di arrivo (ad esempio, una coda di attività), mentre Stack è quando l'ultimo elemento aggiunto deve essere elaborato per primo (ad esempio, lo stack di chiamate o il ripristino delle azioni).
Problema:
Spesso si sceglie erroneamente la struttura sbagliata per un determinato compito o si utilizza in modo non sicuro in scenari multithreading. Si verificano anche errori nell'estrazione di uno stack o di una coda vuota, che provocano eccezioni.
Soluzione:
In Visual Basic, ci sono classi corrispondenti per lavorare con queste strutture:
System.Collections.QueueSystem.Collections.StackEsempio di lavoro con una coda e uno stack:
' Lavorare con una coda Dim q As New Queue() q.Enqueue("Primo") q.Enqueue("Secondo") Dim item = q.Dequeue() ' item = "Primo" ' Lavorare con uno stack Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Caratteristiche chiave:
1. È possibile modificare una collezione Queue o Stack durante l'iterazione su di essa con For Each?
No, modificare (aggiungere o rimuovere elementi) la collezione mentre la si attraversa con For Each porta a InvalidOperationException.
Esempio di codice:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' solleverà un'eccezione durante l'iterazione Next
2. Cosa restituirà il metodo Peek() per una Queue o Stack vuota?
Peek solleva un'eccezione InvalidOperationException se la collezione è vuota, invece di restituire un valore predefinito.
Esempio di codice:
Dim st As New Stack() Dim first As Object = st.Peek() ' Eccezione!
3. Qual è la differenza tra Queue(Of T) e Queue e perché si dovrebbe preferire le collezioni generiche?
Queue(Of T) è la versione generica di Queue, è sicura per il tipo e consente di evitare il boxing/unboxing. È meglio scegliere sempre questa quando si lavora con tipi noti.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Solo Integer
In un'applicazione in cui è implementata una coda di stampa di documenti, lo sviluppatore memorizza i lavori di stampa in Stack e non in Queue. Di conseguenza, i documenti vengono stampati in ordine inverso (l'ultimo aggiunto viene trattato per primo).
Vantaggi:
Svantaggi:
Lo stesso progetto cambia Stack in Queue per memorizzare i lavori di stampa. Ora i documenti vengono stampati in ordine da sinistra a destra, come si aspetta l'utente.
Vantaggi:
Svantaggi: