ProgramaciónDesarrollador de aplicaciones de escritorio en Visual Basic

¿Cómo se implementan y se utilizan las colecciones de tipo Queue y Stack en Visual Basic, cuándo elegir cada una de estas estructuras y en qué puntos es importante prestar atención al trabajar con colas y pilas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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.Queue
  • System.Collections.Stack

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

  • Queue garantiza el orden FIFO, Stack — LIFO.
  • Para acceder al primer elemento se utiliza Peek(), y para eliminar — Dequeue()/Pop().
  • Es necesario comprobar la propiedad Count para evitar errores al extraer de una colección vacía.

Preguntas capciosas.

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

Errores típicos y anti-patrón

  • Intentar extraer un elemento de una Queue/Stack vacía sin verificar Count.
  • Utilizar colecciones no genéricas cuando se dispone de una cola o pila con un tipo de datos conocido (pérdida de seguridad de tipo, errores de conversión de tipos).
  • Modificar la colección durante la iteración.

Ejemplo de la vida real

Caso negativo

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:

  • Implementación sencilla, todas las operaciones estándar están disponibles.

Contras:

  • Ruptura de la lógica de funcionamiento — el usuario espera la impresión de documentos en orden de adición, pero recibe un comportamiento inverso.
  • Se confunde la secuencia de eventos y surge retroalimentación negativa de los usuarios.

Caso positivo

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:

  • El comportamiento coincide con las expectativas de los usuarios.
  • Se simplifica el mantenimiento y las pruebas.

Contras:

  • Con una mala gestión del acceso concurrente a la cola, pueden surgir condiciones de carrera (se puede resolver utilizando colecciones seguras para múltiples hilos o sincronización).