Menu
Coddy logo textTech

Podsumowanie — generyczna kolekcja

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 72 z 107.

challenge icon

Wyzwanie

Łatwy

Zbudujmy generyczną strukturę danych Queue, która pokaże wszystko, czego nauczysz się o typach generycznych w Go! W przeciwieństwie do stosu (LIFO), kolejka działa zgodnie z zasadą First-In-First-Out (FIFO): pierwszy dodany element jest pierwszym usuwanym.

Podzielisz kod na dwa pliki:

  • queue.go: Zdefiniuj generyczną kolekcję kolejki.

    Utwórz generyczną strukturę Queue[T any], która przechowuje elementy. Kolejka powinna obsługiwać następujące operacje:

    • Enqueue(item T) — dodaje element na końcu kolejki
    • Dequeue() (T, bool) — usuwa i zwraca element z początku kolejki wraz z wartością logiczną wskazującą powodzenie (zwróć wartość zerową i false, jeśli kolejka jest pusta)
    • Peek() (T, bool) — zwraca element z początku kolejki, nie usuwając go (ten sam schemat zwracanych wartości co w przypadku Dequeue)
    • Size() int — zwraca liczbę elementów w kolejce
    • IsEmpty() bool — zwraca true, jeśli kolejka nie zawiera żadnych elementów

    Utwórz również funkcję konstruktora NewQueue[T any]() *Queue[T], która zwraca wskaźnik do zainicjowanej, pustej kolejki.

  • main.go: Zademonstruj działanie kolejki z różnymi typami na podstawie danych wejściowych.

    Wczytaj wskaźnik typu (int lub string), a następnie wczytaj serię poleceń do wykonania na kolejce. Każde polecenie znajduje się w osobnym wierszu:

    • enqueue [value] — dodaje wartość do kolejki
    • dequeue — usuwa i wypisuje element z początku kolejki (wypisz empty, jeśli kolejka jest pusta)
    • peek — wypisuje element z początku kolejki, nie usuwając go (wypisz empty, jeśli kolejka jest pusta)
    • size — wypisuje bieżący rozmiar

    Wczytuj polecenia, aż otrzymasz done.

Dane wejściowe będą miały następującą postać:

  • Wiersz 1: Wskaźnik typu (int lub string)
  • Kolejne wiersze: Polecenia aż do done

Na przykład, dla danych wejściowych:

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

Wynik powinien być następujący:

10
10
2
20
30
empty

A dla danych wejściowych:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Wynik powinien być następujący:

2
hello
hello
world

Kolejka powinna działać identycznie dla typów całkowitych i tekstowych, pokazując, jak jedna generyczna implementacja obsługuje wiele konkretnych typów, zachowując pełne bezpieczeństwo typów.

Spróbuj swoich sił

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Odczytaj wskaźnik typu
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: Utwórz kolejkę liczb całkowitych za pomocą NewQueue[int]()
		// Przetwarzaj polecenia dla kolejki liczb całkowitych
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Obsłuż polecenia: enqueue, dequeue, peek, size
			// Dla enqueue przekształć wartość z parts[1] na liczbę całkowitą
			// Dla dequeue/peek wypisz "empty", jeśli kolejka jest pusta
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: Utwórz kolejkę ciągów znaków za pomocą NewQueue[string]()
		// Przetwarzaj polecenia dla kolejki ciągów znaków
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Obsłuż polecenia: enqueue, dequeue, peek, size
			// Dla enqueue użyj ciągu znaków z parts[1]
			// Dla dequeue/peek wypisz "empty", jeśli kolejka jest pusta
			_ = command
		}
	}
	
	// Te instrukcje zapobiegają błędom nieużywanych importów podczas tworzenia programu
	_ = strconv.Atoi
	_ = fmt.Println
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online