1 / 37

Ders İçeriği

Ders İçeriği. Yığın Tanım ve Operasyonları Kuyruk Tanım ve Operasyonları. Yığın ve Kuyruk. Yığın ve kuyruk modelleri verinin geçici olarak saklanması gerektiği ve işlemlerin belirli bir sırada yapılması gerektiğinde kullanılan bir yapıdır.

brigid
Download Presentation

Ders İçeriği

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ders İçeriği • Yığın • Tanım ve Operasyonları • Kuyruk • Tanım ve Operasyonları

  2. Yığın ve Kuyruk • Yığın ve kuyruk modelleri verinin geçici olarak saklanması gerektiği ve işlemlerin belirli bir sırada yapılması gerektiğinde kullanılan bir yapıdır. • Bellek parçası üzerinde işleyen yığın ve kuyruk yapıları işleyiş olarak birbirlerine ters olarak çalışmaktadırlar.

  3. Yığın ve Kuyruk

  4. Yığın Yapısı • Yığın tüm ekleme ve silme işlemlerinin bir uçtan yapıldığı bir veri yapısıdır. • Alternatif olarak, yığın yapısında silinecek eleman listeye eklenen son elemandır. Bu işlem son giren ilk çıkar (last in first out - LIFO) şeklinde isimlendirilir. • Klasik örnek: kafelerdeki üst üste dizili tabaklar.

  5. Yığın Yapısı koy(3); koy(2); koy(12); koy(11); koy(5); 12 al();

  6. Yığın Gerçekleştirimi • Yığın yapısını gerçekleştirmek için 2 yol vardır. • Dizi kullanmak • Bağlantılı liste kullanmak

  7. Dizi Gerçekleştirimi • Yığın yapısı dizi üzerinde en fazla N tane eleman tutacak şekilde yapılabilir. 12 al(); koy(11);

  8. Yığın ve Operasyonları publicclassYigin { intkapasite=100; // maksimum eleman sayısı intS[]; //Yığın elemanları – pozitif tam sayı intp; // eleman sayısı publicYigin(){ // yapıcı yordam s[] = newint[kapasite]; p = 0; } intkoy(int item); intal(); intust(); booleanbosmu(); booleandolumu(); }

  9. Yığın Operasyonları – bosmu, dolumu // yığın boşsa true döndür publicbooleanbosmu() { if (p < 1) return true; else return false; } //bitti-bosmu // Yığın doluysa true döndür publicboolean dolumu(){ if (p == kapasite-1) return true; else return false; } // bitti-dolumu

  10. Yığın Operasyonları: koy // Yığının üstüne yine bir eleman koy // Başarılı ise 0 başarısız ise -1 döndürür. intkoy(intyeni){ if (dolumu()){ // Yığın dolu. Yeni eleman eklenemez. return -1; } S[p] = yeni; p++; return 0; } /bitti-koy

  11. Yığın Operasyonları: ust // Yığının en üstündeki sayıyı döndürür // Yığın boşsa, -1 döndürür publicintust(){ if (bosmu()){ // Yığın başsahata dönder System.out.println("Stack underflow"); return -1; } return S[p-1]; }

  12. Stack Operations: al // En üsteki elemanı dönder. // Yığın boşsa -1dönder. publicintal(){ if (bosmu()){ // Yığın boşsa hata dönder System.out.println(“Stack underflow”); return -1; } int id = p-1; // en üsteki elemanın yeri p--; // elemanı sil return S[id]; }

  13. Yığın Kullanım Örneği publicstaticvoidmain(String[] args){ Yiginy = newYigin(); if (y.bosmu()) System.out.println(“Yığın boş”); y.koy(49); y.koy(23); System.out.println(“Yığının ilk elemanı: ”+y.al()); y.koy(44); y.koy(22); System.out.println(“Yığının ilk elemanı:”+y.al()); System.out.println(“Yığının ilk elemanı: ”+y.al()); System.out.println(“Yığının ilk elemanı: ”+y.ust()); System.out.println(“Yığının ilk elemanı: ”+y.al());. if (y.bosmu()) System.out.println(“Yığın boş”); }

  14. Bağlantılı Liste Gerçekleştirimi Baş Başlangıç durumu koy(3) Baş 3 eklendikten sonra 6 6 6 15 3 9 2 6 15 2 9 2 15 9 2 15 al() al() Baş 3 alındıktan sonra Baş 9 alındıktan sonra

  15. Bağlantılı Liste Gerçekleştirimi publicclassYiginDugumu{ inteleman; YiginDugumusonraki; YiginDugumu(int e){ eleman =e; sonraki =NULL; } } publicclassYigin { privateYiginDugumuust; publicYigin(){ust=null;} void koy(inteleman); intal(); intust(); booleanbosmu(); };

  16. Yığın Operasyonları: koy, bosmu // Yığına yeni eleman ekle publicvoid koy(inteleman){ YiginDugumu x = new YiginDugumu(eleman); x.sonraki = ust; ust = x; } // Yığın boşsa true döndür publicbooleanbosmu(){ if (ust == NULL) return true; else return false; }

  17. Yığın Operasyonları: ust // Yığının ilk elemanını döndür publicintust(){ if (bosmu()){ System.out.println(“Stack underflow”); // Boş yığın return -1; // Hata } return ust.eleman; } //bitti-ust

  18. Yığın Operasyonları: Al // Yığının en üst elemanın siler ve döndürür. publicint Al(){ if (bosmu()){ System.out.println(“Stack underflow”); // Boş yığın. return -1; // Hata } YiginDugumutemp = ust; // Bir sonraki elemana geç ust = ust.sonraki; return temp.eleman; } //bitti-al

  19. Yığın Kullanım Örneği publicstaticvoidmain(String[] args){ Yiginy = newYigin(); if (y.bosmu()) System.out.println(“Yığın boş”); y.koy(49); y.koy(23); System.out.println(“Yığının ilk elemanı: ”+y.al()); y.koy(44); y.koy(22); System.out.println(“Yığının ilk elemanı:”+y.al()); System.out.println(“Yığının ilk elemanı: ”+y.al()); System.out.println(“Yığının ilk elemanı: ”+y.ust()); System.out.println(“Yığının ilk elemanı: ”+y.al());. if (y.bosmu()) System.out.println(“Yığın boş”); }

  20. Uygulama • Derleyici/kelime işlemciler • Derleyicileri düşünecek olursak yazdığımız ifadede ki parantezlerin aynı olup olmadığını kontrol ederler. • Örneğin: 2*(i + 5*(7 – j / (4 * k)) ifadesinde parantez eksikliği var. ")" • Yığın kullanarak ifadedeki parantezlerin eşit sayıda olup olmadığını kontrol eden programı yazınız.

  21. Uygulama • Yığın kullanarak parantez kontrol: • Boş bir yığın oluştur ve sembolleri okumaya başla • Eğer sembol başlangıç sembolü ise ( ‘(‘,’[’,’{’ ) Yığına koy • Eğer sembol kapanış sembolü ise ( ‘)’,’]’,’}’ ) • Eğer yığın boşsa hata raporu döndür • Değilse Yığından al Eğer alınan sembol ile başlangıç sembolü aynı değilse hata gönder • İfade bitti ve yığın dolu ise hata döndür.

  22. Kuyruk Yapısı • Kuyruk tüm ekleme işlemlerinin bir uçtan, silme işlemlerinin ise diğer uçtan yapıldığı bir veri yapısıdır. • Alternatif olarak, kuyruk yapısında silinecek eleman listede en uzun süre olan elemandır. Bu işlem ilk giren ilk çıkar (first in first out - FIFO) şeklinde isimlendirilir. • Klasik örnek: Yemek sırasında bekleyen öğrenciler.

  23. Kuyruk Yapısı Ekle() Çıkart() • Kuyruğun başı ve sonu vardır. • Ekleme operasyonu Ekle(Enqueue) • Silme operasyonu Çıkart(Dequeue)

  24. Kuyruk Yapısı • Kuyruk tüm ekleme işlemlerinin bir uçtan, silme işlemlerinin ise diğer uçtan yapıldığı bir veri yapısıdır. • Genel Kuyruk Operasyonları • ekle(eleman) – kuyruğun sonuna elemanı ekler • cikart() – en öndeki elemanı çıkartır ve döndürür • bosmu() – kuyruk boşsa true döndürür • dolumu() – kuyruk doluysa true döndürür

  25. Kuyruk Gerçekleştirimi • 2 tür gerçekleştirim vardır: • Dizi kullanarak • Bağlantılı liste kullanarak

  26. Dizi Kullanarak Gerçekleştirim • N boyutlu bir dizi kullanılır. • ön kuyruğun ilk elemanını tutar. Dizide ilk elemanın kaçıncı indisten başlayacağını belirtir. • arka kuyrukta son elemandan sonraki ilk boşluğu tutar. • elemanSayisi kuyruktaki eleman sayısını tutar. • Boş kuyruk eleman sayısının sıfır olduğu durumdur. • Dolu kuyruk eleman sayısının N’ye eşit olduğu durumdur.

  27. 5 6 2 4 3 0 1 • on ve arka birbirlerine eşit ve elemanSayisi = 0  Boş kuyruk Boş kuyruk Q arka = 3 on = 3 elemanSayisi = 0 5 6 2 4 3 0 1 • on kuyruktaki ilk elemanı tutar • arka son elemandan sonraki ilk boş yeri tutar. Yarı dolu kuyruk Q 7 8 2 15 9 4 6 elemanSayisi = 3 arka = 6 on = 3 5 6 2 4 3 0 1 • on ve arka birbirlerine eşit ve elemanSayisi=7  Dolu kuyruk. Dolu kuyruk Q 7 8 2 15 9 4 6 on = 3 elemanSayisi = 7 arka = 3 Dizi Kullanarak Gerçekleştirim • Kuyruğu N boyutlu bir dizi (int K[N]) ve 3 değişken (int on, int arka, int elemanSayisi) ile gerçekleştirebiliriz.

  28. Dizi Kullanarak Gerçekleştirim 5 6 2 4 3 0 1 elemanSayisi = 3 İlk durum Q Ekle(4) 8 15 6 on = 3 arka = 6 5 6 2 4 3 0 1 elemanSayisi = 4 4 eklen sonra Q Ekle(20) 8 15 4 6 arka = 0 on = 3 Kuyruğun kavramsal görünümü: Döngüsel dizi 5 6 2 4 3 0 1 elemanSayisi = 5 20 eklen sonra Q Çıkart() 8 15 6 20 4 6 Ön = 4 arka = 1 on = 3 5 4 0 Arka = 1 8 20 elemanSayisi = 4 5 6 2 4 3 0 1 15 silin sonra 1 6 4 Q 8 6 20 4 2 3 arka = 1 on = 4

  29. Dizi Gerçekleştirimi: Tanımlama ve Operasyonlar public classkuyruk{ private int K[N]; // kuyruk elemanlarını tutan dizi private int on; // kuyruğun başı private int arka; // kuyruğun sonu private int elemanSayisi; // kuyruktaki eleman sayısı public kuyruk(); public booleanbosmu(); public booleandolumu(); public int ekle(int item); public int cikart(); };

  30. Kuyruk Operasyonları: Yapıcı, bosmu, dolumu // yapıcı yordam public Kuyruk(){ on = arka = elemanSayisi = 0; } // Kuyruk boşsa true döndür publicbooleanbosmu(){ return elemanSayisi == 0; } // Kuyruk doluysa ture döndür publicboolean dolumu(){ return elemanSayisi == N; }

  31. Kuyruk Operasyonları: Ekle // Kuyruğa yeni bir eleman ekle // Başarılı olursa 0 başarısız olursa -1 döndür publicint ekle(intyeni){ if (dolumu()){ System.out.println(“Kuyruk dolu.”); return -1; } K[arka] = yeni; // Yeni elemanı sona koy arka++; if (arka == N) arka = 0; elemanSayisi++; return 0; }

  32. Kuyruk Operasyonları: Çıkart // Kuyruğun önündeki elemanı çıkart ve döndür. // Kuyruk boşsa -1 döndür publicintcikart(){ int id = -1; if (bosmu()){ System.out.println(“Kuyruk boş”); return -1; } id = on; // ilk elemanın olduğu yer on++; if (on == N) on = 0; elemanSayisi--; return K[id]; // elemanı döndür }

  33. Kuyruk Kullanım Örneği 01 public static void main(String[] args){ 02 Kuyrukk; 03 04if (k.bosmu()) 05 System.out.println(“Kuyruk boş”); 06 07 k.ekle(49); 08 k.ekle(23); 09 10 System.out.println(“Kuyruğun önü:”+k.cikart()); 11 k.ekle(44); 12 k.ekle(22); 13 14System.out.println(“Kuyruğun ilk elemanı:”+k.cikart()); 15 System.out.println(“Kuyruğun ilk elemanı:”+k.cikart()); 16 System.out.println(“Kuyruğun ilk elemanı:”+k.cikart()); 17System.out.println(“Kuyruğun ilk elemanı:”+k.cikart()); 18 19if (k.bosmu()) 20 System.out.println(“Kuyruk boş”); 21}

  34. Dizi Gerçekleştirimi: Son Söz • Kuyruğu N-1 elemanlı bir dizi (int K[N]) ve 2 tane değişken (int on, int arka) ile gerçekleştirebiliriz. • Aşağıdakileri nasıl tanımlayabileceğimizi düşünün. • Boş kuyruk • Dolu kuyruk • On ve arka birbirine eşit ise boş kuyruk Boş kuyruk Q arka = 3 on = 3 • On ve arka arasında 1 tane boşluk varsa dolu kuyruk Dolu kuyruk Q 7 8 2 15 4 6 on = 3 arka = 2

  35. Bağlantılı Liste Gerçekleştirimi Ön Arka Başlangıç durumu cikart() cikart() ekle(3) Ön Arka 3 eklendikten sonra 6 2 15 3 9 15 6 9 2 15 3 6 2 15 3 6 Arka Ön 9 çıkartıldıktan sonra Ön Arka 2 çıkartıldıktan sonra

  36. Tanımlama ve Operasyonlar publicclassKuyrukDugumu { publicinteleman; publicKuyrukDugumusonraki; publicKuyrukDugumu(int e){ eleman =e; sonraki =null; } } publicclassKuyruk{ privateKuyrukDugumuon; // Kuyruğun önü privateKuyrukDugumuarka; // Kuyruğun arkası public Kuyruk(){ on = arka = null; } publicbooleanbosmu() { ... } publicvoid ekle(inteleman) { ... } publicintcikart() { ... } }

  37. Kuyruk Uygulamaları • Yazıcı kuyruğu • Telesekreter

More Related