Generic stack
- Rust kursu
- Orta seviye
- Ders 112/115
- 7 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
fn peek(&self) -> Option<&T> {
self.ogeler.____()
}
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 |