Menu
Coddy logo textTech

Özet - Generic Koleksiyon

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 72 / 107.

challenge icon

Görev

Kolay

Go'da generic'ler hakkında öğrendiğiniz her şeyi sergileyen generic bir Queue (Kuyruk) veri yapısı inşa edelim! Bir yığının (stack - LIFO) aksine, kuyruk İlk-Giren-İlk-Çıkar (FIFO) düzenini takip eder; yani eklenen ilk öğe, çıkarılan ilk öğedir.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • queue.go: Generic kuyruk koleksiyonunuzu tanımlayın.

    Öğeleri dahili olarak saklayan generic bir Queue[T any] struct'ı oluşturun. Kuyruğunuz şu işlemleri desteklemelidir:

    • Enqueue(item T) - kuyruğun arkasına bir öğe ekler
    • Dequeue() (T, bool) - kuyruğun önündeki öğeyi kaldırır ve döndürür, ayrıca işlemin başarılı olup olmadığını belirten bir boolean döndürür (kuyruk boşsa sıfır değerini ve false döndürün)
    • Peek() (T, bool) - önündeki öğeyi kaldırmadan döndürür (Dequeue ile aynı dönüş modelini kullanır)
    • Size() int - kuyruktaki öğe sayısını döndürür
    • IsEmpty() bool - kuyrukta öğe yoksa true döndürür

    Ayrıca, başlatılmış boş bir kuyruğa işaretçi döndüren bir NewQueue[T any]() *Queue[T] yapıcı (constructor) fonksiyonu oluşturun.

  • main.go: Girişe bağlı olarak kuyruğunuzu farklı tiplerle gösterin.

    Bir tip göstergesi (int veya string) okuyun, ardından kuyruk üzerinde gerçekleştirilecek bir dizi komutu okuyun. Her komut kendi satırındadır:

    • enqueue [value] - değeri kuyruğa ekler
    • dequeue - önündeki öğeyi kaldırır ve yazdırır (kuyruk boşsa empty yazdırın)
    • peek - önündeki öğeyi kaldırmadan yazdırır (kuyruk boşsa empty yazdırın)
    • size - mevcut boyutu yazdırır

    done komutunu alana kadar komutları okumaya devam edin.

Aşağıdaki girişler sağlanacaktır:

  • Satır 1: Tip göstergesi (int veya string)
  • Sonraki satırlar: done gelene kadar komutlar

Örneğin, şu giriş verildiğinde:

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

Çıktınız şu olmalıdır:

10
10
2
20
30
empty

Ve şu giriş verildiğinde:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

Çıktınız şu olmalıdır:

2
hello
hello
world

Kuyruğunuz hem tam sayı hem de dize tipleri için aynı şekilde çalışmalı ve tek bir generic uygulamanın tam tip güvenliğini korurken birden fazla somut tipi nasıl işlediğini göstermelidir.

Kendin dene

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Tip göstergesini oku
	scanner.Scan()
	typeIndicator := scanner.Text()
	
	if typeIndicator == "int" {
		// TODO: NewQueue[int]() kullanarak bir integer kuyruğu oluşturun
		// Integer kuyruğu için komutları işle
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Komutları yönetin: enqueue, dequeue, peek, size
			// enqueue için, parts[1] içindeki integer değerini ayrıştırın
			// dequeue/peek için, kuyruk boşsa "empty" yazdırın
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: NewQueue[string]() kullanarak bir string kuyruğu oluşturun
		// String kuyruğu için komutları işle
		
		for scanner.Scan() {
			line := scanner.Text()
			if line == "done" {
				break
			}
			
			parts := strings.SplitN(line, " ", 2)
			command := parts[0]
			
			// TODO: Komutları yönetin: enqueue, dequeue, peek, size
			// enqueue için, parts[1] içindeki string değerini kullanın
			// dequeue/peek için, kuyruk boşsa "empty" yazdırın
			_ = command
		}
	}
	
	// Bunlar, geliştirme sırasında kullanılmayan import hatalarını önlemek için buradadır
	_ = strconv.Atoi
	_ = fmt.Println
}

Nesne Yönelimli Programlama bölümündeki tüm dersler