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
- Pop
- isEmpty
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:
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
Ö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?
Yorum Gönder