CodeBlanks Logo Icon CodeBlanks

Generic stack

Vec tabanlı generic Stack<T> veri yapısını yazarsın.

Bitirme görevi: generic yığın

Orta seviyenin bitirme görevlerinde generic'ler, trait'ler, yineleyiciler ve hata yönetimini birleştireceksin. İlki: her türle çalışan bir yığın (stack). Son giren ilk çıkar (LIFO):

struct Yigin<T> {
    ogeler: Vec<T>,
}

impl<T> Yigin<T> {
    fn new() -> Self { .. }
    fn push(&mut self, x: T) { .. }
    fn pop(&mut self) -> Option<T> { .. }      // boşsa None
    fn peek(&self) -> Option<&T> { .. }        // çıkarmadan bak
    fn len(&self) -> usize { .. }
    fn is_empty(&self) -> bool { .. }
}

peek referans döndürür; böylece T'nin Clone olması gerekmez.

Vec'e devretmek

Yığın davranışı Vec'in yöntemleriyle birebir örtüşür; sarmalayıcı yalnızca API'yi daraltır ve anlamlı adlar verir:

impl<T> Yigin<T> {
    fn push(&mut self, x: T) { self.ogeler.push(x); }
    fn pop(&mut self) -> Option<T> { self.ogeler.pop() }
    fn peek(&self) -> Option<&T> { self.ogeler.last() }
}

Kullanıcı vektörün ortasına eleman ekleyemez; yığının değişmezleri korunur.

Uygulama Yığın

Yukarıdaki Yigin<T> türünü tüm metotlarıyla yaz. 1, 2, 3 ekle; pop(), peek(), len() sonuçlarını ve boş bir Yigin<&str> için is_empty() değerini tek satırda yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Yigin<T> {
    ogeler: Vec<T>,
}

impl<T> Yigin<T> {
    fn new() -> Self {
        Self { ogeler: Vec::new() }
    }
    fn push(&mut self, x: T) {
        self.ogeler.push(x);
    }
    fn pop(&mut self) -> Option<T> {
        self.ogeler.pop()
    }
    fn peek(&self) -> Option<&T> {
        self.ogeler.last()
    }
    fn len(&self) -> usize {
        self.ogeler.len()
    }
    fn is_empty(&self) -> bool {
        self.ogeler.is_empty()
    }
}

fn main() {
    let mut y = Yigin::new();
    for n in [1, 2, 3] {
        y.push(n);
    }
    let p = y.pop();
    let t = y.peek().copied();
    let bos: Yigin<&str> = Yigin::new();
    println!("{:?} {:?} {} {}", p, t, y.len(), bos.is_empty());
}

Beklenen çıktı

Some(3) Some(2) 2 true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>peek</code> için <code>Vec</code>'in hangi yöntemi kullanılır?

  • get(0)
  • last() Doğru cevap
  • first()
  • pop()

Açıklama: Yığının tepesi vektörün sonudur; last() son elemana Option<&T> verir.

2 Tepeye bak

Soru
fn peek(&self) -> Option<&T> {
    self.ogeler.____()
}
Cevap
fn peek(&self) -> Option<&T> {
    self.ogeler.last()
}

Açıklama: last son elemana referans verir.

3 İşlem ve sonuç (1, 2, 3 eklendi)

Kavram Anlamı
pop() Some(3)
sonra peek() Some(2)
sonra len() 2
Yigin::<&str>::new().is_empty() true

Orta seviye bölümündeki tüm dersler