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 genérica de fila que demonstra tudo o que você aprendeu sobre genéricos em Go! Diferentemente de uma pilha (LIFO), uma fila segue a ordenação 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 armazene os itens internamente. Sua fila deve oferecer estas operações:

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

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

  • main.go: demonstre sua fila com diferentes tipos com base na entrada.

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

    • enqueue [value] - adiciona o valor à fila
    • dequeue - remove e imprime o item do início (imprima empty se a fila estiver vazia)
    • peek - imprime o item do início sem removê-lo (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, dada a entrada:

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 dada a entrada:

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 tipos inteiros e string, demonstrando como uma única implementação genérica lida com vários tipos concretos, mantendo a segurança de tipos completa.

Experimente você mesmo

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Leia o indicador de tipo
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Crie uma fila de inteiros usando NewQueue[int]()
		// Processe os 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: Trate os comandos: enqueue, dequeue, peek, size
			// Para enqueue, faça o parse do valor inteiro de parts[1]
			// Para dequeue/peek, imprima "empty" se a fila estiver vazia
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Crie uma fila de strings usando NewQueue[string]()
		// Processe os 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: Trate os comandos: enqueue, dequeue, peek, size
			// Para enqueue, use o valor 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

Pratique por conta própria: Compilador de Go online