Menu
Coddy logo textTech

Recapitulação - Coleção Genérica

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 72 de 107.

challenge icon

Desafio

Fácil

Vamos construir uma estrutura de dados Queue (Fila) genérica que demonstra tudo o que você aprendeu sobre generics em Go! Ao contrário de uma pilha (LIFO), uma fila segue a ordem First-In-First-Out (FIFO) — o primeiro item adicionado é o primeiro a ser removido.

Você organizará seu código em dois arquivos:

  • queue.go: Defina sua coleção de fila genérica.

    Crie uma struct genérica Queue[T any] que armazena itens internamente. Sua fila deve suportar estas operações:

    • Enqueue(item T) - adiciona um item ao final da fila
    • Dequeue() (T, bool) - remove e retorna o item da frente da fila, junto com um booleano indicando sucesso (retorne o valor zero e false se a fila estiver vazia)
    • Peek() (T, bool) - retorna o item da frente sem removê-lo (mesmo padrão de retorno do Dequeue)
    • Size() int - retorna o número de itens na fila
    • IsEmpty() bool - retorna true se a fila não tiver itens

    Também crie uma função construtora NewQueue[T any]() *Queue[T] que retorna um ponteiro para uma fila vazia inicializada.

  • main.go: Demonstre sua fila com diferentes tipos baseados na entrada.

    Leia um indicador de tipo (int ou string), depois leia uma série de comandos para executar na fila. Cada comando está em sua própria linha:

    • enqueue [value] - adiciona o valor à fila
    • dequeue - remove e imprime o item da frente (imprima empty se a fila estiver vazia)
    • peek - imprime o item da frente sem remover (imprima empty se a fila estiver vazia)
    • size - imprime o tamanho atual

    Leia os comandos até receber done.

As seguintes entradas serão fornecidas:

  • Linha 1: Indicador de tipo (int ou string)
  • Linhas seguintes: Comandos até done

Por exemplo, dado:

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

Sua saída deve ser:

10
10
2
20
30
empty

E dado:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Sua saída deve ser:

2
hello
hello
world

Sua fila deve funcionar de forma idêntica para os tipos inteiro e string, demonstrando como uma única implementação genérica lida com múltiplos tipos concretos enquanto mantém a segurança de tipos completa.

Experimente você mesmo

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Ler o indicador de tipo
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Criar uma fila de inteiros usando NewQueue[int]()
		// Processar comandos para a fila de inteiros
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Lidar com os comandos: enqueue, dequeue, peek, size
			// Para enqueue, analise o valor inteiro de parts[1]
			// Para dequeue/peek, imprima "empty" se a fila estiver vazia
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Criar uma fila de strings usando NewQueue[string]()
		// Processar comandos para a fila de strings
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Lidar com os comandos: enqueue, dequeue, peek, size
			// Para enqueue, use o valor da string de parts[1]
			// Para dequeue/peek, imprima "empty" se a fila estiver vazia
			_ = command
		}
	}
	
	// Estes estão aqui para evitar erros de importação não utilizada durante o desenvolvimento
	_ = strconv.Atoi
	_ = fmt.Println
}

Todas as lições de Programação Orientada a Objetos