Rust
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.
Örnek çözümü göster
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());
}
Kendini test et
-
<code>peek</code> için <code>Vec</code>'in hangi yöntemi kullanılır?
Cevabı göster
last() — Yığının tepesi vektörün sonudur; last() son elemana Option<&T> verir.
-
Tepeye bak
fn peek(&self) -> Option<&T> {
self.ogeler.____()
}
Cevabı göster
fn peek(&self) -> Option<&T> {
self.ogeler.last()
}
-
İşlem ve sonuç (1, 2, 3 eklendi)
- pop()
- Some(3)
- sonra peek()
- Some(2)
- sonra len()
- 2
- Yigin::<&str>::new().is_empty()
- true
Sıradaki ders: Trait ile şekil