Konuşma notu: Bugün bilgisayar biliminin en eski, en çok kullanılan iki doğrusal yapısıyla tanışıyoruz. Yığın = yalnız bir uca dokun. Kuyruk = bir uçtan ekle, diğerinden çıkar. Bu tek kural farkı, gerisinin tamamını açıklıyor.
Konuşma notu: On altı kısa animasyon dersin tamamını taşıyor; her biri, fikri tanıttığımız yerde, bir kez görünüyor.
Konuşma notu: Her terim ilk geçtiği yerde tam olarak tanımlanır; bu tablo yalnızca onu nerede tekrar bulacağınızı söylüyor.
Konuşma notu: Canlı denemek isteyenler şimdi bir terminal açsın; bugünkü her kod parçası tam olarak gösterildiği gibi derlenip çalışır.
Konuşma notu: Bellek hakkında yeni hiçbir şey gerekmiyor bugün — yalnızca hangi uca dokunabileceğinize dair yeni kurallar var.
Konuşma notu: Bugün malloc ve free'i yeniden kullanacağız; unutulan bir free'nin tam olarak nerede ısırdığını göstereceğiz.
Konuşma notu: Bugünün tek yeni parçası, zincirin hangi ucuna/uçlarına dokunabileceğinizi kısıtlamak.
Konuşma notu: Sınıfa sorun: bir kuyrukta en önce gelenler hangi uçta oturur? Önde — ve bütün fikir bu.
Konuşma notu: Haritadaki her kutu aşağıda kendi slaytlarını alıyor; çoğunun yanında kısa bir animasyon ve eksiksiz bir C/Java programı var.
Konuşma notu: Bölüm 1, yığını sıfırdan kurar: önce dizi sürümü, sonra bağlı sürüm, ikisi de aynı küçük arayüzle.
Konuşma notu: Sorun: bu "geçmiş" özelliğini yalnızca bir dizi ya da bağlı listeyle nasıl kurarsınız? Cevap geliyor.
Konuşma notu: Şu anda bilgisayarınızın yaptığı her fonksiyon çağrısı, tam olarak bu erken makineler gibi, hâlâ bir yığın kullanıyor.
Konuşma notu: LIFO = Son Giren, İlk Çıkar. Bugünkü her işlem için bu yemekhane resmini aklınızda tutun.
Konuşma notu: Bu üç kısa ad her dilde ve her ders kitabında standarttır; şimdi öğrenin, hiç değişmezler.
Konuşma notu: Bir ADT, bir yapının neyi yaptığını tanımlar, nasıl yaptığını değil — bu tablo, dizi ya da bağlı liste olmasından bağımsız geçerli.
Konuşma notu: Bellekte başka hiçbir şey yer değiştirmez — yalnızca tek bir tamsayı olan top değişir.
Konuşma notu: Normal örnek: 10 push (12, 7, 25, 3, 18, 9, 30, 14, 5, 21), sonra 4 pop — top ve dizinin bir adımda bir güncellendiğini izleyin.
Konuşma notu: Önce denetle, doluysa reddet, sonra iki yazma — top kayar, değer yerine oturur. Her zaman iki adım.
Konuşma notu: push ile aynı biçim, aynası: boşu denetle, en üst hücreyi oku, top'u aşağı kaydır.
Konuşma notu: En son itilen (21) ilk geri gelir, sonra 5, 14, 30 — son giren, ilk çıkar.
Konuşma notu: Bu sabit-zaman garantisi yığının bütün amacı — ortaya erişmek başka bir yapı gerektirir.
Konuşma notu: C'de dizi sınırları dışına yazmak dostane bir hata vermez — yakındaki belleği sessizce bozar.
Konuşma notu: 10 hücreli bir yığına 11 push (son push taşar), sonra 13 pop (boşalınca alttan taşar) — iki denetimin de ateşlenişini izleyin.
Konuşma notu: Geçerli indisler 0..CAP-1 arasıdır, yığın top CAP-1'e ulaştığı an dolar, bir adım sonra değil.
Konuşma notu: Cevabı açıklamadan önce sınıfın yanıtlamasına izin verin — indis 0 gerçek, geçerli bir hücredir.
Konuşma notu: -1 geçerli bir indis olmadığı için yalnızca "hiç eleman yok" anlamına gelebilir.
Konuşma notu: Tam olarak Hafta 2'deki aynı düğüm-ve-işaretçi fikri, yalnız bir uca dokunmakla sınırlandırılmış.
Konuşma notu: malloc'un bir düğüm oluşturduğunu, sonra üç işaretçi güncellemesinin top'u taşıdığını izleyin — hiçbir yerde kapasite sınırı yok.
Konuşma notu: Yeni düğüm eski en üstü gösterir, sonra top yeni düğüme taşınır — her zaman üç atama.
Konuşma notu: tmp, top zaten ilerledikten sonra değerini okuyup serbest bırakabilmek için eski en üstü tam gereken süre kadar tutar.
Konuşma notu: Sınırsız kapasitenin bedeli, eleman başına biraz fazla bellek ve daha kötü önbellek yerelliği.
Konuşma notu: free(tmp); return tmp->data; zaten geri verilmiş belleği okur — bazen "çalışır", bazen çöker.
Konuşma notu: Her iki yönde de push ve pop O(1); fark hız sınıfı değil, kapasite ve bellek yerelliği.
Konuşma notu: Her push top'a 1 ekler, her pop 1 çıkarır — aritmetiği birlikte yapın.
Konuşma notu: Bu, az önce okuduğumuz push/pop kodunun bir adımda bir yaptığı tam olarak bu hesap.
Konuşma notu: Aynı küçük yığın arayüzü üzerine kurulu üç klasik algoritma: parantez denetimi, postfix değerlendirme, infix'i postfix'e çevirme.
Konuşma notu: Sınıfa A + B * C'yi elle hesaplattırın — herkes fark etmeden önceliği uygular.
Konuşma notu: RPN hesap makineleri bugün hâlâ satılıyor; sıradaki slaytlardaki algoritma, içlerinde çalışanın ta kendisi.
Konuşma notu: Postfix ve prefix, değerlendirme sırasında ne parantez ne öncelik tablosu ister — bu iş zaten bir kez yapıldı.
Konuşma notu: "En son açılan" ifadesi herkesin aklına hemen bir yığın getirmeli — bu cümle algoritmanın ta kendisi.
Konuşma notu: Üç ayrı başarısızlık yolu; doğru bir denetleyici yalnız ilkini değil, üçünü de yakalamalı.
Konuşma notu: Uyumsuzluğu izleyin: tepede `(` varken bir `]` gelir — eşleşme yok, hemen reddet.
Konuşma notu: Küçük bir yardımcı: bu kapanan, bu açanla eşleşiyor mu?
Konuşma notu: İnsanların en çok unuttuğu tam olarak son satır: dizgi, yığında hâlâ eşleşmemiş açanlarla bitebilir.
Konuşma notu: Tek geçiş, tek yığın, tamam — bugün göreceğimiz hemen her yığın algoritması bu biçimde.
Konuşma notu: Sık bir hata: yalnız 1. durumu denetleyip son `return top == -1;`'i unutmak.
Konuşma notu: Tek bir eşleşmemiş açan parantez — sonunda yığının neye benzediğini adım adım izleyin.
Konuşma notu: Bu, önceki slayttaki tam olarak 3. başarısızlık durumu.
Konuşma notu: Animasyon çalışmadan önce sınıfa sonucu tahmin ettirin.
Konuşma notu: Her sayı itilir; her işleç iki değeri çeker, kendini uygular, sonucu geri iter.
Konuşma notu: Küçük bir dağıtıcı — şaşırtıcı bir şey yok, yalnızca dört aritmetik işleç.
Konuşma notu: b önce çıkar (sağ işlenen), a ikinci (sol işlenen) — sıra, eksi ve bölmede önemli.
Konuşma notu: Hesap makineleri ve derleyiciler ifadeleri gerçek zamanlı, tam olarak böyle, dev girdilerde değerlendirir.
Konuşma notu: Bu, öğrencilerin bu algoritmada yazdığı en sık hata.
Konuşma notu: Her algoritmanın sonunda gerçekte ne ürettiğini düşünün.
Konuşma notu: Bu ayrım — değerleri çökertmek ile sembolleri yeniden sıralamak — yavaşça tekrarlanmaya değer.
Konuşma notu: Prefix, her açıdan postfix'in ayna görüntüsüdür — tarama yönü, ve ilk çıkan işlenen.
Konuşma notu: Normal örnek: 11 belirteç, hatasız. "Zor" örnek aslında hata verir — daha fazla belirteç otomatik olarak geçerli bir ifade demek değildir.
Konuşma notu: Çekme sırasını tersine çevirmek, değişmeli olmayan her işleci (eksi, bölme) sessizce bozar.
Konuşma notu: Bu, çoğu öğrencinin yazdığı ilk "derleyici biçimli" klasik algoritma.
Konuşma notu: Her işlenen doğrudan çıktıya gider; her işleç önce bekleyen daha güçlü işleçleri boşaltır, sonra itilir.
Konuşma notu: Küçük bir öncelik tablosu — çarpma/bölme, artı/eksiden daha sıkı bağlanır.
Konuşma notu: Son while döngüsü "boşaltma" adımı: yığında kalan her şeyin de çıktıya ulaşması gerekir.
Konuşma notu: Bugün gördüğümüz her yığın algoritmasıyla aynı biçim, aynı sınır.
Konuşma notu: A-B-C, (A-B)-C olmalı; bu da eşit öncelikli işleçlerin de önce çekilmesini gerektirir.
Konuşma notu: Sınıfa otuz saniye verin, sonra açıklayıp algoritmanın kendi izine karşılaştırın.
Konuşma notu: Sınıf emin görünmüyorsa bu izi satır satır birlikte geçin.
Konuşma notu: Yepyeni bir algoritma yerine zaten tanıdık üç adım — bütün marifet bu.
Konuşma notu: Infix-postfix ile aynı normal örnek, A+B*C-D+E*F, böylece iki çıktı yan yana karşılaştırılabilir.
Konuşma notu: A+B+C+... gibi aynı öncelikli bir zincir için postfix ve prefix çıktılarını karşılaştırarak kuralı görün.
Konuşma notu: Özyinelemeyi anlaşılır kılan bağlantı: özyinelemeli olsun olmasın, her fonksiyon çağrısı gerçek bir yığın çerçevesi iter.
Konuşma notu: Doğrudan yanıtlanabilecek kadar basit bir duruma ulaşana kadar, aynı problemin daha küçük bir sürümü üzerinde kendini çağıran bir fonksiyon.
Konuşma notu: Birazdan tam olarak bitecek bellek yapısıyla, çağrı yığınıyla, tanışacağız.
Konuşma notu: Mümkün olan en küçük özyinelemeli fonksiyon — temel durumlarla ilgili her şey burada ilk kez görünüyor.
Konuşma notu: Normal örnek: 10'dan geri sayım. Uç durumlar n=0 ve n=-4, ikisi de temel duruma anında ulaşır.
Konuşma notu: "n=-4'ten geri sayım"ı düzeltilmeden önce sonsuz döngüye çeviren tam olarak bu hata.
Konuşma notu: Her fonksiyon çağırdığınızda bir yığın kullanıyordunuz — bugüne kadar yalnızca göremiyordunuz.
Konuşma notu: Normal örnek: fact(10), 10 çerçeve derinliğinde — her biri bir sonrakini bekler, sonra çerçeveler ters sırada çözülür.
Konuşma notu: İki satır: özyinelemeyi durduran bir temel durum, ve kesinlikle daha küçük bir problem üzerinde özyinelemeli çağrı.
Konuşma notu: Çıktı küçük, ama arkasındaki çağrı yığını makinesi bu bölümün asıl konusu.
Konuşma notu: Özyineleme çoğunlukla bir döngüden daha anlaşılır okunur, ama asla bellek maliyetinden bağımsız değildir.
Konuşma notu: Seçicideki "zor" örneğin 12'de durmasının nedeni tam olarak bu — taşmaya bir çağrı kala.
Konuşma notu: Bu çökmenin, Bölüm 1'den zaten bildiğiniz bir adı var: yığın taşması — yalnızca kendi dizinize değil çağrı yığınına uygulanmış.
Konuşma notu: 0'a ulaşması beklenen tek bir n'den 2'şer azaltmak, bu hatanın klasik bir versiyonudur.
Konuşma notu: Birlikte sayın: fact(3), fact(2), fact(1), fact(0).
Konuşma notu: Bu çerçevelerin hiçbiri henüz dönmedi — hâlâ yığında olmalarının nedeni tam olarak bu.
Konuşma notu: -1, -2, -3, -4... yolunda hiçbir zaman 1'e eşit olmaz.
Konuşma notu: Yanlış bir temel durum koşulu, eksik bir temel durum kadar tehlikelidir.
Konuşma notu: Özyinelemesi yazması kolay olduğu hâlde temelden üstel olan bir problemin standart ilk örneği.
Konuşma notu: Efsane: keşişler 64 altın diski taşıyor, işleri bitince dünya sona eriyor. Birazdan göreceğimiz gibi, kötü bir süre tahmini değil.
Konuşma notu: 1. ve 3. adımlar aynı problemdir, yalnızca daha küçük, çubuklar yeniden etiketlenmiş — kusursuz bir özyineleme.
Konuşma notu: Normal örnek: 4 disk, 15 hamle. Kodda açık bir yığına gerek yok — çağrı yığınının kendisi "from, to, via"yı hatırlıyor.
Konuşma notu: Dört satır, ve özyineleme yapısı ruhen fact() ile tıpatıp aynı — daha küçük problem, hareket et, daha küçük problem.
Konuşma notu: Dört disk için on beş hamle — bu sayının nedenini birazdan tam olarak göreceğiz.
Konuşma notu: Hiçbir uygulama hilesi üstel büyümeyi düzeltmez — yalnızca daha küçük bir n düzeltir.
Konuşma notu: Keşişlerin dünyanın sonuna dair kehaneti, bir bakıma, makul bir süre tahminiydi.
Konuşma notu: Burada "from, to, via"yı tutan çağrı yığını, DFS'in "nereye geri dönülecek"i tutacağı aynı çağrı yığını.
Konuşma notu: İki slayt önceki formülü uygulayın.
Konuşma notu: Diskleri bir artırmak, hamle sayısını kabaca ikiye katlayıp bir eksiltiyor.
Konuşma notu: Daha küçük alt-problem için "hedef" ve "yedek"in ne olduğunu düşünün.
Konuşma notu: Bu dönüş, öğrencilerin elle izlemekte en çok zorlandığı kısım — animasyon bunu görünür kılıyor.
Konuşma notu: Yığının ayna görüntüsü: aynı iki işlem, karşıt uçlar, farklı ad — LIFO yerine FIFO.
Konuşma notu: Sorun: süpermarket sırasından kim önce çıkar — en yeni gelen mi, en uzun bekleyen mi?
Konuşma notu: Yığın: bir uç. Kuyruk: iki uç, her işlem için biri — kavramsal sıçramanın tamamı bu.
Konuşma notu: Bu ADT'yi, her biri kendi ödünleşimiyle, üç farklı şekilde kuracağız.
Konuşma notu: Elemanlar dequeue edildikçe öndeki kullanılmayan boşlukta bir şeyler ters gidiyor — animasyon bunu gösteriyor.
Konuşma notu: Normal örnek: 8 hücreyi doldur, 3'ünü çıkar, yine de iki enqueue daha başarısız olur — front, dequeue'nun boşalttığı hücreleri hiç yeniden kullanmaz.
Konuşma notu: Basit ve O(1), ama rear hiç geri gelmiyor, dequeue önde kaç hücre boşaltırsa boşaltsın.
Konuşma notu: Hücre 0, 1, 2 boş, ama kuyruk yine de dolu olduğunu iddia ediyor — bu kayma sorunu.
Konuşma notu: Her dequeue'dan sonra elemanları kaydırmak bunu düzeltirdi, ama O(1) dequeue'ları O(n)'e çevirir — kabul edilemez.
Konuşma notu: enqueue'nun gerçekte neyi denetlediğine tekrar bakın.
Konuşma notu: Bu, dairesel kuyruğu mükemmel biçimde kuruyor.
Konuşma notu: Boşa giden yer, yalnızca diziyi düz bir çizgi olarak düşündüğümüz için boşa gidiyordu.
Konuşma notu: Normal örnek: 10 hücrelik halka, orta karışıklık, bir başa dönüş — rear'ın dequeue'nun boşalttığı hücreleri yeniden kullanışını izleyin.
Konuşma notu: Saf sürümden tek fark: rear modulo ile başa dönüyor, count gerçek doluluğu takip ediyor.
Konuşma notu: enqueue ile aynı ayna biçim — front da artık modulo ile başa dönüyor.
Konuşma notu: count, akıllı indis hilelerine güvenmek yerine belirsizliği doğrudan çözer.
Konuşma notu: Bu, gerçek bir sınırlı tamponda gerçekten kullanacağınız kuyruk uygulaması.
Konuşma notu: Yalnız rear başa dönüp front dönmezse, halka ilk başa dönüşten sonra sessizce bozulur.
Konuşma notu: Hem "az önce boşaldı" hem "az önce doldu" durumları front == rear gösterebilir.
Konuşma notu: count'un isteğe bağlı bir kayıt değil, belirsizliği çözen tek şey olmasının nedeni bu.
Konuşma notu: Bağlı yığınla aynı taşma-kaldırma ödünleşimi, ama bu sefer her uca bir işaretçi gerekiyor.
Konuşma notu: Tek düğümle, front ve rear aynı düğümü gösterir — en baştaki bu özel durumu izleyin.
Konuşma notu: Boş kuyruk durumu her iki işaretçiyi de yeni düğüme ayarlar; aksi hâlde yalnız rear hareket eder.
Konuşma notu: Kuyruk az önce boşaldıysa, rear da NULL'a çekilmeli, yoksa sonraki enqueue çöp üzerinden yazar.
Konuşma notu: Tek bir düğüm hem öndür hem arka; her iki işaretçi de ona işaret etmelidir.
Konuşma notu: Her yapının nereden eklediğini, nereden çıkardığını karşılaştırın.
Konuşma notu: rear olmadan, enqueue son düğümü bulmak için tüm listeyi gezerdi — O(n), O(1) değil.
Konuşma notu: Bir deque, yalnızca hangi işlemleri çağırdığınıza bağlı olarak, aynı anda bir yığın ve bir kuyruk gibi davranır.
Konuşma notu: Burada çift bağlı liste üzerine kurulu; her uç kendi işaretçi güncelleme çiftini alıyor.
Konuşma notu: push_front'un push_back'in tam karşıt ucuna eklediğini izleyin — sıradan bir kuyruğun hiç yapamayacağı bir şey.
Konuşma notu: push_front, back/next yerine front/prev'e dokunan, bu fonksiyonun ayna görüntüsüdür.
Konuşma notu: pop_front, back/prev yerine front/next'e dokunarak bunu tam olarak yansıtır.
Konuşma notu: C'de standart bir deque yok, bu yüzden bir tane kuruyoruz; Java'da java.util.ArrayDeque zaten bunu veriyor.
Konuşma notu: Her çağrıyı tek tek izleyin.
Konuşma notu: Öne eklemeler soldan geriye doğru, arkaya eklemeler sağda ileriye doğru kurulur.
Konuşma notu: Bugün yeni bir kod gerektirmiyor — yalnızca zaten kurduğumuz kuyruklardan birkaçı, artı küçük bir seçim kuralı.
Konuşma notu: Zamanlayıcı önce üst kuyrukları sunar, yalnızca üsttekiler boşken alta iner.
Konuşma notu: Normal örnek: 12 süreç, üç sınıfa dengeli dağılmış. admit(), süreci kendi seviyesine ekler; pick_next() her zaman önce seviye 0'ı dener.
Konuşma notu: Gerçek zamanlayıcılar, bir alt seviyenin sonsuza kadar aç kalmaması için yaşlandırma ya da zaman dilimleme ekler.
Konuşma notu: Her bir seviyenin gerçekte ne olduğuna bakın.
Konuşma notu: Gelecek hafta, bir öbek üzerine kurulu yakın akrabası öncelik kuyruğuyla tanışacaksınız.
Konuşma notu: Üçü de tam olarak aynı LIFO kuralına uyar — yalnızca depolama ve kapasite sınırı farklı.
Konuşma notu: Dairesel kuyruk gerçekte kullanacağınız olan; saf dizi kuyruğu bir öğretim basamağı.
Konuşma notu: İkisi de sıradan kuyruğu genelleştirir — biri hangi uca dokunduğunuzu gevşeterek, diğeri öncelik ekleyerek.
Konuşma notu: Dört çok farklı görünen problem, hepsi tam olarak aynı küçük yığın arayüzüyle çözüldü.
Konuşma notu: Bugünden yalnız bir cümle hatırlanacaksa, hatırlanmaya değer olan bu.
Konuşma notu: Bunlar, yazılı notların sonunda listelenen, çözüm taslaklı aynı beş alıştırma.
Konuşma notu: Bunlar hafta notlarının sonundaki kendini sınama testini, her soru bir slaytta olacak şekilde yansıtıyor.
Konuşma notu: Sorun, bekleyin, sonra ilerleyin.
Konuşma notu: Bölüm 1'deki tabak yığını resmi bütün fikrin ta kendisi.
Konuşma notu: Sorun, bekleyin, sonra ilerleyin.
Konuşma notu: Bölüm 5'teki bekleme sırası resmi bütün fikrin ta kendisi.
Konuşma notu: Geçerli indis aralığını düşünün.
Konuşma notu: top == CAP'i beklemek zaten dizinin sonunun bir hücre ötesinde olurdu.
Konuşma notu: "Önce sağ işlenen" kuralını hatırlayın.
Konuşma notu: `8 2 -`'nin neden 2 - 8 değil 8 - 2 anlamına geldiği tam olarak bu.
Konuşma notu: Bu, kayma sorununun bir soru olarak yeniden ifadesi.
Konuşma notu: Kuyruk, dizinin sonuna çarpana kadar sağa doğru "kayar".
Konuşma notu: front == rear belirsizliğini düşünün.
Konuşma notu: Bir başa dönüşten sonra, front == rear artık soruyu tek başına çözemez.
Konuşma notu: Bölüm 3'ün ilk kod slaytını hatırlayın.
Konuşma notu: Her özyinelemeli fonksiyonun ulaşılabilir en az bir temel duruma ihtiyacı vardır.
Konuşma notu: Bölüm 1'deki LIFO kuralıyla karşılaştırın.
Konuşma notu: Tıpkı herhangi bir yığında en son itilen elemanın çekilecek bir sonraki eleman olması gibi.
Konuşma notu: Bölüm 4'teki yinelemeyi hatırlayın.
Konuşma notu: n = 64 için, saniyede bir hamleyle bu yaklaşık 585 milyar yıl.
Konuşma notu: Her yapının hangi uçlara dokunmasına izin verildiğini düşünün.
Konuşma notu: Sıradan bir yığın yalnız tepesine dokunur; sıradan bir kuyruk yalnız bir uçtan ekler, diğerinden çıkarır.
Konuşma notu: Sol alt ağacı çöz, düğümü ziyaret et, sağ alt ağacı çöz — tam olarak Hanoi'nin özyineleme biçimi, yeni bir veri biçimi üzerinde.
Konuşma notu: Bunlar, hafta notlarının sonunda listelenen aynı kaynaklar.
Konuşma notu: Tarihsel kaynaklar (Lucas, Łukasiewicz), bugünkü "kısa tarihçe" slaytlarının dayandığı kaynaklar.