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

Construyamos una estructura de datos genérica de cola que demuestre todo lo que has aprendido sobre 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 que se elimina.

Organizarás tu código en dos archivos:

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

    Crea una estructura genérica 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 del frente sin eliminarlo (el mismo patrón de retorno que Dequeue)
    • Size() int - devuelve el número de elementos de la cola
    • IsEmpty() bool - devuelve true si la cola no tiene elementos

    Crea también 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 según la entrada.

    Lee un indicador de tipo (int o string) y, después, lee una serie de comandos para ejecutar en la cola. Cada comando ocupa su propia línea:

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

    Lee comandos hasta recibir done.

Se proporcionarán las siguientes entradas:

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

Por ejemplo, dada la siguiente entrada:

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 dada la siguiente entrada:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Tu salida debería ser:

2
hello
hello
world

Tu cola debe funcionar de forma idéntica tanto para tipos enteros como para tipos de cadena, demostrando cómo una única implementación genérica maneja varios tipos concretos mientras mantiene una 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 los 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 los 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

Practica por tu cuenta: Compilador de Go online