Ders erii Yn Tanm ve Operasyonlar Kuyruk Tanm

  • Slides: 37
Download presentation
Ders İçeriği • Yığın – Tanım ve Operasyonları • Kuyruk – Tanım ve Operasyonları

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

Yığın ve Kuyruk • Yığın ve kuyruk modelleri verinin geçici olarak saklanması gerektiği ve

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. 2

Yığın ve Kuyruk İşlem Yığın Kuyruk Ekleme Koy(push) Ekle(add) Alma Al(pop) Çıkart(get) Sıfırla(reset) 3

Yığın ve Kuyruk İşlem Yığın Kuyruk Ekleme Koy(push) Ekle(add) Alma Al(pop) Çıkart(get) Sıfırla(reset) 3

Yığın Yapısı • Yığın tüm ekleme ve silme işlemlerinin bir uçtan yapıldığı bir veri

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 üste dizili tabaklar. 4

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

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

Yığın Gerçekleştirimi • Yığın yapısını gerçekleştirmek için 2 yol vardır. – Dizi kullanmak –

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 6

Dizi Gerçekleştirimi • Yığın yapısı dizi üzerinde en fazla N tane eleman tutacak şekilde

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

Yığın ve Operasyonları public class Yigin { int kapasite=100; // maksimum eleman sayısı int

Yığın ve Operasyonları public class Yigin { int kapasite=100; // maksimum eleman sayısı int S[]; //Yığın elemanları – pozitif tam sayı int p; // eleman sayısı public Yigin(){ // yapıcı yordam s[] = new int[kapasite]; p = 0; } int koy(int item); int al(); int ust(); boolean bosmu(); boolean dolumu(); } 8

Yığın Operasyonları – bosmu, dolumu // yığın boşsa true döndür public boolean bosmu() {

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

Yığın Operasyonları: koy // Yığının üstüne yine bir eleman koy // Başarılı ise 0

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. int koy(int yeni){ if (dolumu()){ // Yığın dolu. Yeni eleman eklenemez. return -1; } S[p] = yeni; p++; return 0; } /bitti-koy 10

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

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 public int ust(){ if (bosmu()){ // Yığın başsa hata dönder System. out. println("Stack underflow"); return -1; } return S[p-1]; } 11

Stack Operations: al // En üsteki elemanı dönder. // Yığın boşsa -1 dönder. public

Stack Operations: al // En üsteki elemanı dönder. // Yığın boşsa -1 dönder. public int al(){ 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]; } 12

Yığın Kullanım Örneği public static void main(String[] args){ Yigin y = new Yigin(); if

Yığın Kullanım Örneği public static void main(String[] args){ Yigin y = new Yigin(); 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 ilk elemanı: ”+ ”+ y. al()); y. ust()); y. al()); . if (y. bosmu()) System. out. println(“Yığın boş”); } 13

Bağlantılı Liste Gerçekleştirimi Baş 9 2 6 15 Başlangıç durumu 6 15 3 eklendikten

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

Bağlantılı Liste Gerçekleştirimi public class Yigin. Dugumu { int eleman; Yigin. Dugumu sonraki; Yigin.

Bağlantılı Liste Gerçekleştirimi public class Yigin. Dugumu { int eleman; Yigin. Dugumu sonraki; Yigin. Dugumu(int e){ eleman = e; sonraki = NULL; } } public class Yigin { private Yigin. Dugumu ust; public Yigin() {ust = null; } void koy(int eleman); int al(); int ust(); boolean bosmu(); }; 15

Yığın Operasyonları: koy, bosmu // Yığına yeni eleman ekle public void koy(int eleman){ Yigin.

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

Yığın Operasyonları: ust // Yığının ilk elemanını döndür public int ust(){ if (bosmu()){ System.

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

Yığın Operasyonları: Al // Yığının en üst elemanın siler ve döndürür. public int Al(){

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

Yığın Kullanım Örneği public static void main(String[] args){ Yigin y = new Yigin(); if

Yığın Kullanım Örneği public static void main(String[] args){ Yigin y = new Yigin(); 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 ilk elemanı: ”+ ”+ y. al()); y. ust()); y. al()); . if (y. bosmu()) System. out. println(“Yığın boş”); } 19

Uygulama • Derleyici/kelime işlemciler – Derleyicileri düşünecek olursak yazdığımız ifadede ki parantezlerin aynı olup

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. 20

Uygulama • Yığın kullanarak parantez kontrol: 1) Boş bir yığın oluştur ve sembolleri okumaya

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

Kuyruk Yapısı • Kuyruk tüm ekleme işlemlerinin bir uçtan, silme işlemlerinin ise diğer uçtan

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. 22

Kuyruk Yapısı Ekle() Çıkart() 23 19 10 5 • Kuyruğun başı ve sonu vardır.

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

Kuyruk Yapısı • Kuyruk tüm ekleme işlemlerinin bir uçtan, silme işlemlerinin ise diğer uçtan

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 24

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

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

Dizi Kullanarak Gerçekleştirim • N boyutlu bir dizi kullanılır. • ön kuyruğun ilk elemanını

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. • eleman. Sayisi 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. 26

Dizi Kullanarak Gerçekleştirim • Kuyruğu N boyutlu bir dizi (int K[N]) ve 3 değişken

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

Dizi Kullanarak Gerçekleştirim eleman. Sayisi = 3 İlk durum 0 1 2 Q 4

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

Dizi Gerçekleştirimi: Tanımlama ve Operasyonlar public class kuyruk { private int int K[N]; //

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

Kuyruk Operasyonları: Yapıcı, bosmu, dolumu // yapıcı yordam public Kuyruk(){ on = arka =

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

Kuyruk Operasyonları: Ekle // Kuyruğa yeni bir eleman ekle // Başarılı olursa 0 başarısız

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

Kuyruk Operasyonları: Çıkart // Kuyruğun önündeki elemanı çıkart ve döndür. // Kuyruk boşsa -1

Kuyruk Operasyonları: Çıkart // Kuyruğun önündeki elemanı çıkart ve döndür. // Kuyruk boşsa -1 döndür public int cikart(){ 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; eleman. Sayisi--; return K[id]; // elemanı döndür } 32

Kuyruk Kullanım Örneği 01 public static void main(String[] args){ 02 Kuyruk k; 03 04

Kuyruk Kullanım Örneği 01 public static void main(String[] args){ 02 Kuyruk k; 03 04 if (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 14 System. 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()); 17 System. out. println(“Kuyruğun ilk elemanı: ”+ k. cikart()); 18 19 if (k. bosmu()) 20 System. out. println(“Kuyruk boş”); 21 } 33

Dizi Gerçekleştirimi: Son Söz • Kuyruğu N-1 elemanlı bir dizi (int K[N]) ve 2

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 • Boş kuyruk On ve arka birbirine eşit ise boş kuyruk Q on = 3 Dolu kuyruk Q 4 7 arka = 2 arka = 3 15 6 on = 3 8 2 • On ve arka arasında 1 tane boşluk varsa dolu kuyruk 34

Bağlantılı Liste Gerçekleştirimi Ön 9 2 6 15 Arka Başlangıç durumu ekle(3) Ön 9

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

Tanımlama ve Operasyonlar public class Kuyruk. Dugumu { public int eleman; public Kuyruk. Dugumu

Tanımlama ve Operasyonlar public class Kuyruk. Dugumu { public int eleman; public Kuyruk. Dugumu sonraki; public Kuyruk. Dugumu(int e){ eleman = e; sonraki = null; } } public class Kuyruk{ private Kuyruk. Dugumu on; // Kuyruğun önü private Kuyruk. Dugumu arka; // Kuyruğun arkası public on = } public } Kuyruk(){ arka = null; boolean bosmu() {. . . } void ekle(int eleman) {. . . } int cikart() {. . . } 36

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

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