Bölüm 3. Çıkın Olcay Taner Yıldız 2014 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 1 / 32
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 2 / 32
Sabit dizi ile tanımlı bir çıkının içerdiği elemanların tanımı 1 public class Ornek{ 2 int icerik; 3 public Ornek(int icerik){ 4 this.icerik = icerik ; 5 } 6 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 3 / 32
Tam sayılar içeren bir çıkının sabit dizi ile tanımı 1 public class Cikin{ 2 Ornek dizi []; 3 int ust; 4 int N; 5 public Cikin(int N){ 6 dizi = new Ornek[N]; 7 this.n = N; 8 ust = -1; 9 } 10 Ornek ust(){ 11 return dizi[ust]; 12 } 13 boolean cikindolu(){ 14 if (ust == N - 1) 15 return true; 16 else 17 return false; 18 } 19 boolean cikinbos(){ 20 if (ust == - 1) 21 return true; 22 else 23 return false; 24 } 25 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 4 / 32
Altı elemandan oluşan büyüklüğü 8 olan bir çıkın yapısının dizi ile gösterimi üst 8 10 4 12 8 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 5 / 32
Çıkına eleman ekleme üst 9 8 10 4 12 8 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 6 / 32
Çıkına yeni bir eleman ekleyen algoritma 1 void cikinekle(ornek yeni){ 2 if (!cikindolu ()){ 3 ust++; 4 dizi [ust] = yeni; 5 } 6 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 7 / 32
Çıkından eleman silme üst 8 10 4 12 8 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 8 / 32
Çıkından bir eleman silen ve o elemanı döndüren algoritma 1 Ornek cikinsil (){ 2 if (!cikinbos ()){ 3 ust --; 4 return dizi[ust+1]; 5 } 6 return null; 7 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 9 / 32
Çıkın İşlemleri (Dizi) Ekleme: O(1) Silme: O(1) O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 10 / 32
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 11 / 32
Tam sayılar içeren bir çıkının bağlı liste ile tanımı 1 public class Cikin{ 2 Eleman ust; 3 public Cikin(){ 4 ust = null; 5 } 6 boolean cikinbos(){ 7 if (ust == null) 8 return true; 9 else 10 return false; 11 } 12 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 12 / 32
Altı elemandan oluşan bir çıkın yapısının bağlı liste ile gösterimi üst 8 10 4 12 18 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 13 / 32
Çıkına eleman ekleme üst 9 8 10 4 12 8 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 14 / 32
Çıkına yeni bir eleman ekleyen algoritma 1 void cikinekle(eleman yeni){ 2 yeni. ileri = ust; 3 ust = yeni; 4 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 15 / 32
Çıkından eleman silme üst 8 10 4 12 18 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 16 / 32
Çıkından bir eleman silen ve o elemanı döndüren algoritma 1 Eleman cikinsil (){ 2 Eleman e = ust; 3 if (!cikinbos()) 4 ust = ust. ileri ; 5 return e; 6 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 17 / 32
Çıkın İşlemleri (Bağlı Liste) Ekleme: O(1) Silme: O(1) O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 18 / 32
O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 19 / 32
Matematiksel İfadeler Belirli bir matematiksel ifadeyi bir değişkene atayan kodlar x = a / b - c + d * e - a * c; Belirli bir matematiksel ifadenin doğru olup olmadığını belirleyen kodlar if (3 * x - 5 > 4 * y * y) O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 20 / 32
Matematiksel İfadeler a/b c+d e a c İşlemler: /, -, +, *, -, * İşlenenler: a, b, c, d ve e O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 21 / 32
Matematiksel ifadenin elemanlarını içeren veri yapısı (1) 1 public class Ornek{ 2 int tip; 3 int islenen; 4 char islem; 5 int oncelik; 6 public Ornek(int islenen){ 7 this.tip = 0; 8 this.islenen = islenen; 9 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 22 / 32
Matematiksel ifadenin elemanlarını içeren veri yapısı (2) 10 public Ornek(char islem){ 11 this.tip = 1; 12 this.islem = islem; 13 switch (islem){ 14 case ( :oncelik = 0; 15 break; 16 case + : 17 case - :oncelik = 1; 18 break; 19 case * : 20 case / :oncelik = 2; 21 break; 22 case ) :oncelik = 3; 23 break; 24 } 25 } 26 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 23 / 32
Arka Gösterim ab/c de +ac arka gösteriminin değerinin hesaplanması aşağıda gösterilmiştir. T 1 = a / b T 1 c - d e * + a c * - T 2 = T 1 - c T 2 d e * + a c * - T 3 = d * e T 2 T 3 + a c * - T 4 = T 2 + T 3 T 4 a c * - T 5 = a * c T 4 T 5 - T 6 = T 4 - T 5 T 6 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 24 / 32
Arka gösterimi verilen bir ifadenin değerini hesaplayan algoritma (1) 1 int hesapla(ornek[] ifade){ 2 int i; 3 Ornek e, e1, e2, s; 4 Cikin c = new Cikin(100); 5 for (i = 0; i < ifade.length; i++){ 6 e = ifade [ i ]; 7 if (e. tip == 0){ 8 c. cikinekle(e); 9 }else{ 10 e2 = c. cikinsil (); 11 e1 = c. cikinsil (); 12 s = islem(e.islem, e1.islenen, e2.islenen); 13 c. cikinekle(s); 14 } 15 } 16 e = c. cikinsil (); 17 return e.islenen; 18 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 25 / 32
Arka gösterimi verilen bir ifadenin değerini hesaplayan algoritma (2) 19 Ornek islem(char ch,int e1,int e2){ 20 int sonuc; 21 switch (ch){ 22 case + :sonuc = e1 + e2; 23 break; 24 case - :sonuc = e1 - e2; 25 break; 26 case * :sonuc = e1 * e2; 27 break; 28 case / :sonuc = e1 / e2; 29 break; 30 } 31 return new Ornek(sonuc); 32 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 26 / 32
Arka gösterimi ab/c de +a olan bir ifadenin çıkın yardımıyla hesaplanması a b / c - d e * + a * b a / c - d e * + a * T 1 = a/b T 1 c - d e * + a * c T 1 - d e * + a * T 2 = T 1 c T 2 d e * + a * d T 2 e * + a * e d T 2 * + a * T 3 = d e + a * T 3 T 2 T 4 = T 2 +T 3 a * T 4 * a T 4 T 5 = a T 4 O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 27 / 32 T 5
Arka gösterimi ab/c de +a olan bir ifadenin çıkın yardımıyla hesaplanması 1. a bir işlenendir. Çıkına eklenir. 2. b bir işlenendir. Çıkına eklenir. 3. / bir işlemdir. Çıkından iki eleman silinir (a ve b), bu iki elemanla / işlemi yapılıp sonuç (T 1 ) çıkına eklenir. 4. c bir işlenendir. Çıkına eklenir. 5. - bir işlemdir. Çıkından iki eleman silinir (T 1 ve c), bu iki elemanla - işlemi yapılıp sonuç (T 2 ) çıkına eklenir. 6. d bir işlenendir. Çıkına eklenir. 7. e bir işlenendir. Çıkına eklenir. 8. * bir işlemdir. Çıkından iki eleman silinir (d ve e), bu iki elemanla * işlemi yapılıp sonuç (T 3 ) çıkına eklenir. 9. + bir işlemdir. Çıkından iki eleman silinir (T 2 ve T 3 ), bu iki elemanla + işlemi yapılıp sonuç (T 4 ) çıkına eklenir. 10. a bir işlenendir. Çıkına eklenir. 11. * bir işlemdir. Çıkından iki eleman silinir (a ve T 4 ), bu iki elemanla * işlemi yapılıp sonuç (T 5 ) çıkına eklenir. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 28 / 32
Verilen bir ifadenin arka gösterimini bulan algoritma (1) 1 void arkagosterim(ornek[] ifade){ 2 int i; 3 Ornek e, e1; 4 Cikin c = new Cikin(100); 5 for (i = 0; i < ifade.length; i++){ 6 e = ifade [ i ]; 7 if (e. tip == 0) 8 System.out.print(e.islenen ); 9 else 10 if (e.islem == ( ) 11 c. cikinekle(e); 12 else 13 if (e.islem == ) ){ 14 e1 = c. cikinsil (); 15 while (e1.islem!= ( ){ 16 System.out.print(e1.islem); 17 e1 = c. cikinsil (); 18 } 19 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 29 / 32
Verilen bir ifadenin arka gösterimini bulan algoritma (2) 20 else{ 21 while (e.oncelik <= c.ust(). oncelik ){ 22 e1 = c. cikinsil (); 23 System.out.print(e1.islem); 24 } 25 c. cikinekle(e); 26 } 27 } 28 while (!c.cikinbos()){ 29 e1 = c. cikinsil (); 30 System.out.print(e1.islem); 31 } 32 } O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 30 / 32
Ara gösterimi A+B (C +D) olan bir ifadenin arka gösteriminin bir çıkın yardımıyla bulunması + + * + ( * + A + B * ( A A AB AB AB + + ( ( ( * + * + * + * + C + D ) ABC ABC ABCD ABCD+ ABCD+*+ O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 31 / 32
Ara gösterimi A+B (C +D) olan bir ifadenin arka gösteriminin bir çıkın yardımıyla bulunması 1. A bir işlenendir. Ekrana yazılır. 2. + bir işlemdir. Çıkında eleman olmadığından çıkına eklenir. 3. B bir işlenendir. Ekrana yazılır. 4. * bir işlemdir. * in önceliği çıkının en üstündeki + dan büyük olduğundan çıkına eklenir. 5. ( bir işlemdir. ( doğrudan çıkına eklenir. 6. C bir işlenendir. Ekrana yazılır. 7. + bir işlemdir. + nın önceliği çıkının en üstündeki ( den büyük olduğundan çıkına eklenir. 8. D bir işlenendir. Ekrana yazılır. 9. ) bir işlemdir. Çıkından ( görene kadar işlemler silinir ve ekrana yazılır. 10. Çıkında kalan * ve + sırasıyla çıkından silinip ekrana yazılır. O. T. Yıldız, C && Java ile Veri Yapılarına Giriş, Boğaziçi Üniversitesi Yayınevi, 2013 32 / 32