Menu
Coddy logo textTech

Resumen - Colección genérica

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy — lección 72 de 107.

challenge icon

Desafío

Fácil

¡Vamos a construir una estructura de datos Queue (cola) genérica que demuestre todo lo que has aprendido sobre los genéricos en Go! A diferencia de una pila (LIFO), una cola sigue el orden First-In-First-Out (FIFO): el primer elemento añadido es el primero en ser eliminado.

Organizarás tu código en dos archivos:

  • queue.go: Define tu colección de cola genérica.

    Crea un struct genérico Queue[T any] que almacene elementos internamente. Tu cola debe admitir estas operaciones:

    • Enqueue(item T) - añade un elemento al final de la cola
    • Dequeue() (T, bool) - elimina y devuelve el elemento del frente de la cola, junto con un booleano que indica el éxito (devuelve el valor cero y false si la cola está vacía)
    • Peek() (T, bool) - devuelve el elemento frontal sin eliminarlo (mismo patrón de retorno que Dequeue)
    • Size() int - devuelve el número de elementos en la cola
    • IsEmpty() bool - devuelve true si la cola no tiene elementos

    También crea una función constructora NewQueue[T any]() *Queue[T] que devuelva un puntero a una cola vacía inicializada.

  • main.go: Demuestra tu cola con diferentes tipos basados en la entrada.

    Lee un indicador de tipo (int o string), luego lee una serie de comandos para realizar en la cola. Cada comando está en su propia línea:

    • enqueue [value] - añade el valor a la cola
    • dequeue - elimina e imprime el elemento frontal (imprime empty si la cola está vacía)
    • peek - imprime el elemento frontal sin eliminarlo (imprime empty si la cola está vacía)
    • size - imprime el tamaño actual

    Lee comandos hasta que recibas done.

Se proporcionarán las siguientes entradas:

  • Línea 1: Indicador de tipo (int o string)
  • Líneas siguientes: Comandos hasta done

Por ejemplo, dado:

int
enqueue 10
enqueue 20
enqueue 30
peek
dequeue
size
dequeue
dequeue
dequeue
done

Tu salida debería ser:

10
10
2
20
30
empty

Y dado:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Tu salida debería ser:

2
hello
hello
world

Tu cola debe funcionar de manera idéntica tanto para tipos enteros como de cadena, demostrando cómo una única implementación genérica maneja múltiples tipos concretos manteniendo la seguridad de tipos completa.

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Lee el indicador de tipo
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Crea una cola de enteros usando NewQueue[int]()
		// Procesa comandos para la cola de enteros
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Maneja los comandos: enqueue, dequeue, peek, size
			// Para enqueue, parsea el valor entero de parts[1]
			// Para dequeue/peek, imprime "empty" si la cola está vacía
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Crea una cola de cadenas usando NewQueue[string]()
		// Procesa comandos para la cola de cadenas
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Maneja los comandos: enqueue, dequeue, peek, size
			// Para enqueue, usa el valor de cadena de parts[1]
			// Para dequeue/peek, imprime "empty" si la cola está vacía
			_ = command
		}
	}
	
	// Estos están aquí para evitar errores de importaciones no utilizadas durante el desarrollo
	_ = strconv.Atoi
	_ = fmt.Println
}

Todas las lecciones de Programación Orientada a Objetos