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 jenerikler hakkında öğrendiğiniz her şeyi gösteren genel bir Kuyruk veri yapısı oluşturalım! Bir yığının (LIFO) aksine kuyruk, İlk Giren İlk Çıkar (FIFO) sıralamasını izler: eklenen ilk öğe, çıkarılan ilk öğedir.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

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

    Öğeleri dahili olarak depolayan genel bir Queue[T any] yapısı oluşturun. Kuyruğunuz şu işlemleri desteklemelidir:

    • Enqueue(item T) - kuyruğun sonuna bir öğe ekler
    • Dequeue() (T, bool) - kuyruğun başındaki öğeyi kaldırır ve döndürür; bununla birlikte 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) - baştaki öğeyi kaldırmadan döndürür (Dequeue ile aynı dönüş düzeni)
    • Size() int - kuyruktaki öğe sayısını döndürür
    • IsEmpty() bool - kuyrukta hiç öğe yoksa true döndürür

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

  • main.go: Kuyruğunuzu girdiye dayalı olarak farklı türlerle gösterin.

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

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

    done alana kadar komutları okumaya devam edin.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Tür belirteci (int veya string)
  • Sonraki satırlar: done gelene kadar komutlar

Örneğin, şu verildiğinde:

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

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

10
10
2
20
30
empty

Ve şu verildiğinde:

string
enqueue hello
enqueue world
size
peek
dequeue
peek
done

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

2
hello
hello
world

Kuyruğunuz hem tamsayı hem de string türleri için aynı şekilde çalışmalı; tek bir genel uygulamanın, tam tür güvenliğini korurken birden fazla somut türü 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 tamsayı kuyruğu oluştur
		// Tamsayı 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ı işle: enqueue, dequeue, peek, size
			// enqueue için, tamsayı değerini parts[1]'den ayrıştır
			// dequeue/peek için, kuyruk boşsa "empty" yazdır
			_ = command
		}
	} else if typeIndicator == "string" {
		// TODO: NewQueue[string]() kullanarak bir string kuyruğu oluştur
		// 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ı işle: enqueue, dequeue, peek, size
			// enqueue için, parts[1]'deki string değerini kullan
			// dequeue/peek için, kuyruk boşsa "empty" yazdır
			_ = 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

Kendi başına pratik yap: Online Go derleyicisi