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

Ders İçeriği

  • Upload
    brigid

  • View
    54

  • Download
    4

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Ders İçeriği

1

Ders İçeriği

• Yığın– Tanım ve Operasyonları

• Kuyruk– Tanım ve Operasyonları

Page 2: Ders İçeriği

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

Page 3: Ders İçeriği

Yığın ve Kuyruk

3

İşlem Yığın Kuyruk

Ekleme Koy(push) Ekle(add)

Alma Al(pop) Çıkart(get)

Sıfırla Sıfırla(reset) Sıfırla(reset)

Page 4: Ders İçeriği

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.

4

Page 5: Ders İçeriği

Yığın Yapısı

5

yığın

koy(3);koy(2);koy(12);

12

2

3

yığın

2

3

yığın

al();12

5

11

2

3

yığın

koy(11);koy(5);

Page 6: Ders İçeriği

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

Page 7: Ders İçeriği

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

eleman tutacak şekilde yapılabilir.

7

12

2

3

2

3

al();

12

11

2

3

koy(11);

Page 8: Ders İçeriği

Yığın ve Operasyonları

8

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ı yordams[] = new int[kapasite];

p = 0; }

int koy(int item); int al(); int ust(); boolean bosmu(); boolean dolumu();}

Page 9: Ders İçeriği

Yığın Operasyonları – bosmu, dolumu

9

// yığın boşsa true döndürpublic boolean bosmu() { if (p < 1) return true; else return false;} //bitti-bosmu

// Yığın doluysa true döndürpublic boolean dolumu(){ if (p == kapasite-1) return true; else return false;} // bitti-dolumu

Page 10: Ders İçeriği

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

return 0;} /bitti-koy

Page 11: Ders İçeriği

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

return S[p-1]; }

Page 12: Ders İçeriği

12

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]; }

Page 13: Ders İçeriği

13

Yığın Kullanım Örneğipublic 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 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ş”); }

Page 14: Ders İçeriği

Bağlantılı Liste Gerçekleştirimi

Başlangıç durumu

koy(3)

15629Baş

3 eklendikten sonra15629Baş

al()

3 alındıktan sonra15629Baş

al()

9 alındıktan sonra1562Baş

Page 15: Ders İçeriği

15

Bağlantılı Liste Gerçekleştirimipublic class YiginDugumu { int eleman; YiginDugumu sonraki; YiginDugumu(int e){ eleman = e; sonraki = NULL; }}

public class Yigin { private YiginDugumu ust;

public Yigin() {ust = null;}

void koy(int eleman); int al(); int ust(); boolean bosmu();};

Page 16: Ders İçeriği

16

Yığın Operasyonları: koy, bosmu

// Yığına yeni eleman eklepublic void koy(int eleman){ YiginDugumu x = new YiginDugumu(eleman); x.sonraki = ust; ust = x;}

// Yığın boşsa true döndürpublic boolean bosmu(){ if (ust == NULL) return true; else return false;}

Page 17: Ders İçeriği

17

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

return ust.eleman;} //bitti-ust

Page 18: Ders İçeriği

18

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 }

YiginDugumu temp = ust; // Bir sonraki elemana geç ust = ust.sonraki; return temp.eleman;} //bitti-al

Page 19: Ders İçeriği

19

Yığın Kullanım Örneğipublic 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 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ş”); }

Page 20: Ders İçeriği

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

Page 21: Ders İçeriği

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ürII. Değilse

Yığından alEğ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

Page 22: Ders İçeriği

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

Page 23: Ders İçeriği

Kuyruk Yapısı

23 19 10 5

23

Ekle()

Çıkart()

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

Page 24: Ders İçeriği

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

Page 25: Ders İçeriği

Kuyruk Gerçekleştirimi• 2 tür gerçekleştirim vardır:

– Dizi kullanarak– Bağlantılı liste kullanarak

25

Page 26: Ders İçeriği

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.

26

Page 27: Ders İçeriği

27

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.

Q

on = 3 arka = 3

Boş kuyruk

• on ve arka birbirlerine eşit ve elemanSayisi = 0 Boş kuyruk

elemanSayisi = 0

1 2 3 4 5 60

Q

on = 3

8615

arka = 6

Yarı dolu kuyruk

24 7

• on kuyruktaki ilk elemanı tutar

• arka son elemandan sonraki ilk boş yeri tutar.

9

elemanSayisi = 3

1 2 3 4 5 60

Q

on = 3

8615

arka = 3

Dolu kuyruk 24 7• on ve arka birbirlerine

eşit ve elemanSayisi=7 Dolu kuyruk.

9

elemanSayisi = 7

1 2 3 4 5 60

Page 28: Ders İçeriği

28

Dizi Kullanarak Gerçekleştirim

Q

on = 3

8615

arka = 1

20 eklensonra

420

1 2 3 4 5 60

Q

on = 3

8615

arka = 6

İlk durum

Q

on = 3

8615

arka = 0

44 eklensonra

Q

on = 4

86

arka = 1

420

0

1

2 3

4

56

20

6

84Arka = 1

Ön = 4

Kuyruğun kavramsal görünümü:Döngüsel dizi

1 2 3 4 5 60

1 2 3 4 5 60

1 2 3 4 5 60

elemanSayisi = 3

elemanSayisi = 4

elemanSayisi = 5

15 silinsonra

elemanSayisi = 4

Ekle(4)

Ekle(20)

Çıkart()

Page 29: Ders İçeriği

29

Dizi Gerçekleştirimi: Tanımlama ve Operasyonlar

public class kuyruk {

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 boolean bosmu(); public boolean dolumu(); public int ekle(int item); public int cikart(); };

Page 30: Ders İçeriği

30

Kuyruk Operasyonları: Yapıcı, bosmu, dolumu

// yapıcı yordampublic Kuyruk(){ on = arka = elemanSayisi = 0;}

// Kuyruk boşsa true döndürpublic boolean bosmu(){ return elemanSayisi == 0;}

// Kuyruk doluysa ture döndürpublic boolean dolumu(){ return elemanSayisi == N;}

Page 31: Ders İçeriği

31

Kuyruk Operasyonları: Ekle

// Kuyruğa yeni bir eleman ekle // Başarılı olursa 0 başarısız olursa -1 döndürpublic 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; elemanSayisi++;

return 0;}

Page 32: Ders İçeriği

32

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

Page 33: Ders İçeriği

33

Kuyruk Kullanım Örneği01 public static void main(String[] args){02 Kuyruk k;0304 if (k.bosmu()) 05 System.out.println(“Kuyruk boş”); 0607 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);1314 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()); 1819 if (k.bosmu()) 20 System.out.println(“Kuyruk boş”); 21 }

Page 34: Ders İçeriği

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

Q

on = 3

8615

arka = 2

Dolu kuyruk 24 7

Q

on = 3 arka = 3

Boş kuyruk• On ve arka birbirine

eşit ise boş kuyruk

• On ve arka arasında 1 tane boşluk varsa dolu kuyruk

Page 35: Ders İçeriği

Bağlantılı Liste Gerçekleştirimi

Başlangıç durumu

ekle(3)

15629Ön Arka

cikart()

15629Ön

3Arka

3 eklendikten

sonra

cikart()

1562Ön

3Arka

9 çıkartıldıktan sonra

156Ön

3Arka

2 çıkartıldıktan sonra

Page 36: Ders İçeriği

36

Tanımlama ve Operasyonlarpublic class KuyrukDugumu { public int eleman; public KuyrukDugumu sonraki; public KuyrukDugumu(int e){ eleman = e; sonraki = null; }}

public class Kuyruk{ private KuyrukDugumu on; // Kuyruğun önü private KuyrukDugumu arka; // Kuyruğun arkası

public Kuyruk(){ on = arka = null; } public boolean bosmu() { ... } public void ekle(int eleman) { ... } public int cikart() { ... }}

Page 37: Ders İçeriği

37

Kuyruk Uygulamaları

•Yazıcı kuyruğu

•Telesekreter