Menu
Coddy logo textTech

Zusammenfassung – Generische Sammlung

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 72 von 107.

challenge icon

Aufgabe

Einfach

Lass uns eine generische Queue-Datenstruktur erstellen, die alles veranschaulicht, was du über Generics in Go gelernt hast! Im Gegensatz zu einem Stack (LIFO) folgt eine Queue der First-In-First-Out-Reihenfolge (FIFO): Das zuerst hinzugefügte Element wird als Erstes entfernt.

Du organisierst deinen Code auf zwei Dateien:

  • queue.go: Definiere deine generische Queue-Sammlung.

    Erstelle eine generische Struktur Queue[T any], die Elemente intern speichert. Deine Queue soll diese Operationen unterstützen:

    • Enqueue(item T) – fügt ein Element am Ende der Queue hinzu
    • Dequeue() (T, bool) – entfernt das Element am Anfang der Queue und gibt es zurück, zusammen mit einem booleschen Wert, der den Erfolg angibt (gib den Nullwert und false zurück, wenn die Queue leer ist)
    • Peek() (T, bool) – gibt das Element am Anfang zurück, ohne es zu entfernen (dasselbe Rückgabemuster wie bei Dequeue)
    • Size() int – gibt die Anzahl der Elemente in der Queue zurück
    • IsEmpty() bool – gibt true zurück, wenn die Queue keine Elemente enthält

    Erstelle außerdem eine Konstruktorfunktion NewQueue[T any]() *Queue[T], die einen Zeiger auf eine initialisierte leere Queue zurückgibt.

  • main.go: Veranschauliche deine Queue mit verschiedenen Typen, die auf der Eingabe basieren.

    Lies einen Typindikator (int oder string) ein und anschließend eine Reihe von Befehlen, die auf der Queue ausgeführt werden sollen. Jeder Befehl steht in einer eigenen Zeile:

    • enqueue [value] – fügt den Wert zur Queue hinzu
    • dequeue – entfernt das Element am Anfang und gibt es aus (gib empty aus, wenn die Queue leer ist)
    • peek – gibt das Element am Anfang aus, ohne es zu entfernen (gib empty aus, wenn die Queue leer ist)
    • size – gibt die aktuelle Größe aus

    Lies Befehle ein, bis du done erhältst.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Typindikator (int oder string)
  • Folgende Zeilen: Befehle bis zu done

Zum Beispiel bei folgender Eingabe:

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

Deine Ausgabe sollte wie folgt aussehen:

10
10
2
20
30
empty

Und bei folgender Eingabe:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Deine Ausgabe sollte wie folgt aussehen:

2
hello
hello
world

Deine Queue sollte für Integer- und String-Typen identisch funktionieren. Dadurch wird veranschaulicht, wie eine einzige generische Implementierung mehrere konkrete Typen verarbeitet und dabei vollständige Typsicherheit gewährleistet.

Probier es selbst

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Lese den Typindikator
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Erstelle eine Integer-Warteschlange mit NewQueue[int]()
		// Verarbeite Befehle für die Integer-Warteschlange
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Behandle Befehle: enqueue, dequeue, peek, size
			// Für enqueue den Integer-Wert aus parts[1] parsen
			// Für dequeue/peek "empty" ausgeben, wenn die Warteschlange leer ist
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Erstelle eine String-Warteschlange mit NewQueue[string]()
		// Verarbeite Befehle für die String-Warteschlange
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Behandle Befehle: enqueue, dequeue, peek, size
			// Für enqueue den String-Wert aus parts[1] verwenden
			// Für dequeue/peek "empty" ausgeben, wenn die Warteschlange leer ist
			_ = command
		}
	}
	
	// Diese sind hier, um Fehler durch ungenutzte Imports während der Entwicklung zu vermeiden
	_ = strconv.Atoi
	_ = fmt.Println
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler