Bu Blogda Ara

16 Mayıs 2010 Pazar

Yığın Veri Yapısı

Merhabalar,
Bu yazımda yığın veri yapısından bahsetmek istiyorum. Çalışması LIFO (Last In First Out - Son Giren İlk Çıkar) ilkesine dayanmaktadır. Fiziksel bir örnek vermek gerekirse yalnızca bir tek arabanın geçebileceği kadar genişlikte olan çıkmaz bir sokağa arabaların ard arda girmesi gibidir. Son giren araba ilk çıkmalıdır ki diğer arabalar çıkabilsin.

Peki Ne İşe Yarar?
Günümüzde bir çok sistem hafıza yönetiminde bu veri yapısını kullanmaktadır. Özellikle sıranın önemli olduğu durumlarda. Mesela, programlama dillerinde açtığımız parantezlerin kapatılıp kapatılmadığının kontrolü, işletim sistemi düzeyinde fonksiyonların çağrımı sırasında parametrelerin aktarımı, aritmetik işlemlerde işlem önceliğinin sağlanması ( çarpmanın toplamaya üstünlüğü), karakter katarlarının ters çevrilmesi vb. bir çok alanda kullanılmaktadır.

Teknik olarak açıklamak gerekirse...
Belirli bir hafıza bölgesini programcıdan soyutluyoruz. Direk erişimi engelliyoruz. Programcıya hafızaya erişmesi için fonksiyonlar veriyoruz. Bunlar push, pop ve isEmpty olabilir. Sırasıyla açıklayalım.
  • Push
Yığına bir eleman eklemek istediğimizde bu fonksiyonu çağırırız. Fonksiyona veridiğimiz değer yığının en sonuna eklenir.
  • Pop
Yığından bir eleman çekmek için kullanılır. Bu fonksiyon bize yığının en sonundaki yani son eklediğimiz elemanı yığından alır bize verir. Daha önceki elemanlara erişmek için Pop fonksiyonunu çağırmaya devam etmeliyiz. Bu fonksiyon herhangi bir parametre almaz.
  • isEmpty
Bu fonksiyon ile yığının boş olup olmadığını kontrol edebiliriz.
Siz fonksiyonlarınıza istediğiniz ismi verebilirsiniz. Korumanız gereken tek şey LIFO ilkesidir. Geri kalan kısmı değiştirmekte özgürsünüz.

Hemen Java ile bir örnekleme yapalım:

package test;

import java.util.ArrayList;

class Stack
{
private ArrayList<Object> objectList; // nesneleri tutacak generic yapımız.

public Stack()
{
objectList = new ArrayList<Object>(); // nesnemizi üretelim.
}

public boolean isEmpty()
{
return objectList.isEmpty(); // liste boş ise yığında boştur.
}

public void Push(Object obj)
{
objectList.add(obj); // yığına eleman ekleyelim.
}

public Object Pop()
{
if (objectList.isEmpty())
return null; // yığın boş ise eleman çekemeyiz. Sonuç null değeri.
Object o = objectList.get(objectList.size()-1); // sondan bir elemanı alalım.
objectList.remove(objectList.size()-1); // sonra bu elemanı yığından çıkartalım.
return o; // geriye döndürelim.
}
}


public class Main{

public static void main(String[] args) {

Stack s = new Stack();
if (s.isEmpty())
System.out.println("yığın boş.");
s.Push(5);
if (s.isEmpty())
System.out.println("bu satırı görmememiz gerekiyor.");
s.Push(45);
System.out.println(s.Pop());
System.out.println(s.Pop());
System.out.println(s.Pop());
System.out.println(s.Pop());
if (s.isEmpty())
System.out.println("yığında eleman yok.");
}

}




En basit haliyle böyle gerçeklenebilirdi sanırım. Veri yapılarını açıklamaya devam edeceğim.
Görüşmek üzere...

2 yorum:

Adsız dedi ki...

mrb ben yığın kullanarak öğrenci bilgisi tutan bir program yazacağım ama genel olarak örneklerde sadece bir numara tutulmuş ancak bebim öğrenci adı soyadı numarası ve bölümü tutmam gerekiyor bunu nasıl yapabilirim

Ramazan Bellek dedi ki...

Örneği inceleyecek olursak, yığın veri yapısını gerçekleyen sınıfın içerisinde elemanları tutan private ArrayList<Object> objectList; satırını göreceğiz. Buradan da görüleceği üzere stack sınıfına bir integer (tam sayı) eklemek zorunda değiliz. Nesne olan herşey bu yığına eklenebilir. Sizin yapmanız gereken öğrenci bilgisi (ya da herhangi başka bir şey) tutan bir sınıf oluşturmak (evet bildiğiniz düz Class yapısı) ve kodu hiç değiştirmeden bu stack yapısına push(öğrenci_nesnesi); şeklinde eklemek. Sınıf buna göre tasarlanmış. Nesne yönelimli bir dil kullanmanın avantajı.

Not: Kendi nesnenizi yığına eklerken ya da okurken tip dönüşümü yapmanız gerekebilir. Bkz: What is type casting in java?