Historia de la pregunta:
Las colecciones Queue y Stack son estructuras de datos básicas que implementan respectivamente los principios FIFO (Primero en entrar, primero en salir) y LIFO (Último en entrar, primero en salir). Se utilizan activamente desde la época del clásico VB6, y con la llegada de VB.NET estas estructuras se convirtieron en clases estándar. Queue es útil para escenarios en los que los elementos deben procesarse en el orden de llegada (por ejemplo, una cola de tareas), mientras que Stack se utiliza cuando se necesita procesar el último elemento añadido antes que los demás (por ejemplo, la pila de llamadas o la cancelación de acciones).
Problema:
A menudo se elige incorrectamente la estructura para una tarea específica o se utilizan de manera insegura en escenarios multihilo. También se producen errores al extraer de una pila o cola vacía, lo que genera excepciones.
Solución:
En Visual Basic, existen clases correspondientes para trabajar con estas estructuras:
System.Collections.QueueSystem.Collections.StackEjemplo de trabajo con cola y pila:
' Trabajo con la cola Dim q As New Queue() q.Enqueue("Primero") q.Enqueue("Segundo") Dim item = q.Dequeue() ' item = "Primero" ' Trabajo con la pila Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Características clave:
1. ¿Se puede modificar la colección Queue o Stack durante la iteración con For Each?
No, modificar (agregar o eliminar elementos) la colección durante la iteración con For Each provoca una InvalidOperationException.
Ejemplo de código:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' provocará una excepción durante la iteración Next
2. ¿Qué devolverá el método Peek() para una Queue o Stack vacía?
Peek lanzará una excepción InvalidOperationException si la colección está vacía, y no devolverá un valor predeterminado.
Ejemplo de código:
Dim st As New Stack() Dim first As Object = st.Peek() ' ¡Excepción!
3. ¿Cuál es la diferencia entre Queue(Of T) y Queue, y por qué debería preferirse las colecciones genéricas?
Queue(Of T) es la versión genérica de Queue, es segura en cuanto al tipo y evita el boxing/unboxing. Siempre es mejor elegirla cuando se trabaja con tipos conocidos.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Solo Integer
En una aplicación que implementa una cola de impresión de documentos, el desarrollador almacena las tareas de impresión en Stack en lugar de en Queue. Como resultado, los documentos se imprimen en orden inverso (los últimos añadidos son los primeros en ser procesados).
Pros:
Contras:
El mismo proyecto cambia Stack por Queue para almacenar las tareas de impresión. Ahora los documentos se imprimen en orden de izquierda a derecha, como espera el usuario.
Pros:
Contras: