1. Yığın veri Yapısının Çalışma Şekli
Yığınlar genelde aynı tipten verilerin tutulduğu ve Son Giren İlk Çıkar
(LIFO) çalışma mantğını kullanan veri yapıları olarak tanımlanır. Bir yığına en
son giren eleman ilk olarak çıkar. Yığınları anlatırken en çok üst üste konmuş
tabaklar veya herhangi bir nesne grubunda çok kullanılana benzetirler. Mesela
bir masanın üstünde sıra ile üst üste konmuş birden fazla tabaktan birisine
ihtiyacımız olursa önce en üsttekini alırız. Bu aldığımız tabakların en son
konulanıdır.
Yığınların çalışma prensibini daha iyi kavramak için yandaki canladırmayı
inceleyelim. Canlandırmada yığının dışında bulunan sayıları yığının içine
koymak için "Yığını Doldur" düğmesine tıkladığımızda sırası ile 17,
23, 4, 55 ve 8'i yığına sokuyor. Yığın doluyken "Yığını Boşalt" düğmesine
tıklayınca ise yığındaki sayıların yerleştirildikleri sıranın tersi sıra ile boşaltır.
Bu durumda en son giren 8 sayısı ilk önce, sonra 55, sonra 4 ve bu sıra ile en
son 17 sayısı yığından dışarı çıkar.
. .NET Sınıf Kütüphanesi Yığın Sınıfı (Stack)
.NET sınıf kütüphanesinde yığın veri yapısını kullanmak için Stack sınıfını
kullanırız. Normalde C ve C++ dillerinde yığın veri yapısını değişik veri
türleri ve kendi tanımladığımız sınıflarla birlikte kullanmak zahmetli bir işti.
(C'de sınıf kavramı yoktur!) Ama .NET ortamında yığınlarımız bize birçok konuda
esneklikler sunarak programlamayı daha zevkli ve verimli hale getiriyor.
.NET'in yığın (Stack) sınıfını kullanmak için program kodunun baş tarafına
using System.Collections; eklememiz gerekir.
Buradan yığın sınıfı System.Collections isim alanında bulunuyor sonucunu da çıkartırız.
C# veya herhangi bir dilde yazılan yığın veri yapılarında Push(), Pop(),
Peek() veya Top(), Clear() fonksiyonları ve Count, özelliği temel olarak
bulunur. Temel fonksiyonların yanında Clone(), CopyTo(), ToArray(), Contains()
ve Equals() metodları .NET'in yığın sınıfında yeralır.
Yığın sınıfının Push() metodu yığına yeni bir eleman ekler. Pop() metodu
ile yığının en üstündeki elemanı yığından siler ve silinen elemanı geriye
döndürür. Eğer yığının tepesindeki elemanı öğrenmek istersek Peek() medodu işimize
yarar. Bu metod yığının tepesindeki nesneyi döndürür ama bu nesneyi yığından
silmez.
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
class YiginSinifi1
{
public static void Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin = new Stack();
// Yigini değişik değerlerde dolduruyoruz..
yigin.Push(12);
yigin.Push(5);
yigin.Push(23);
yigin.Push(34);
yigin.Push(70);
yigin.Push(8);
Console.WriteLine("Yığımızın ilk hali...");
ElemanlariYaz(yigin);
yigin.Push(12);
yigin.Push(5);
yigin.Push(23);
yigin.Push(34);
yigin.Push(70);
yigin.Push(8);
Console.WriteLine("Yığımızın ilk hali...");
ElemanlariYaz(yigin);
// Yigininin tepesinden bir sayı aldık
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
int sayi = (int) yigin.Pop();
Console.WriteLine("\n Yığından {0} sayısını aldık", sayi);
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
int sayi = (int) yigin.Pop();
Console.WriteLine("\n Yığından {0} sayısını aldık", sayi);
// Yigininin tepesinden bir sayı daha aldık
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
sayi = (int)yigin.Pop();
Console.WriteLine("\n Yığından {0} sayısını aldık", sayi);
// ve bunu sayi değişkenine atayıp ekrana yazdıralım
sayi = (int)yigin.Pop();
Console.WriteLine("\n Yığından {0} sayısını aldık", sayi);
// Şimdi ise Yigininin tepesindeki sayıya bir bakalım
// bu sayıyı yığından çıkarmıyoruz.. Sadece ne olduğuna bakıyoruz..
sayi = (int) yigin.Peek();
Console.WriteLine("\n Yığının tepesindeki sayı şu anda : {0}", sayi);
// bu sayıyı yığından çıkarmıyoruz.. Sadece ne olduğuna bakıyoruz..
sayi = (int) yigin.Peek();
Console.WriteLine("\n Yığının tepesindeki sayı şu anda : {0}", sayi);
Console.ReadLine();
}
public static void ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
Yukarıdaki programda önce Stack sınıfından yigin isimli bir nesne oluşturuyoruz.
Sonraki altı satırda yığınımıza 12, 5, 23, 34, 70 ve 8 tamsayılarını Push()
metodu ile ekliyoruz. EkranaYaz() ismini verdiğimiz static fonksiyonumuz (bu
fonksiyon tam olarak optimize edilmiş bir fonksiyon değil! ) ile yığınımızda
bulunan elemanları ekrana yazdırıyoruz. Daha sonra yığından iki tane elemanı
Pop() metodu yardımıyla alıyor ve herbirini ekrana yazdırıyoruz. Programın son
kısmında ise Peek() metodunu kullanarak yığının en üstündeki elemanın ne olduğunu
öğreniyoruz.
Yığın sınıflarında bulunan diğer iki temel fonksiyonlar olan Count
özelliği ve Clear() metodlarıdır. Bunlardan Count, yığın nesnesinde bulunan
elemanların sayısını geriye döndüren bir özelliktir. Özellikler C# dilinde sınıflarda
bulunan üye değişkenlerin değerlerini öğrenmemize ve onların değerlerini değiştirmemize
yarayan bir tür fonksiyonlardır. Count özelliği eleman sayısını int tipinde
döndürür ve sadece okunabilen (readonly) yapıdadır. Özellikler program içinde
çağrılırken parantezleri kullanmayız. Eğer yigini boşaltmak/temizlemek istersek
Clean() metodu işimizi yarayacaktır. Clean() metodu hiçbir parametre almaz ve
hiçbir şey döndürmez. Herhangi bir yığın nesnesinin içinde bir elemanın olup
olmadığını anlamak için Contains() metodu kullanılır. Bu metod aranacak nesneyi
alır ve geriye true veya false değerlerini döndürür. İsterseniz aşağıdaki
programda Contains() ve Clear() metodları ile Count özelliklerini nasıl
kullanabileceğimizi görelim:
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
class YiginSinifi1
{
public static void Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin = new Stack();
// Yığınımıza yeni elemanlar ekliyoruz.
yigin.Push("Ahmet");
yigin.Push("Sefer");
yigin.Push("Cemal");
yigin.Push("Onur");
yigin.Push("Aziz");
yigin.Push("Ahmet");
yigin.Push("Sefer");
yigin.Push("Cemal");
yigin.Push("Onur");
yigin.Push("Aziz");
// Yığında kaç tane eleman bulunduğunu bulup yazalım.
int elemanSayisi= yigin.Count;
Console.WriteLine("\nYığınımızdaki eleman sayısı: {0}", elemanSayisi);
// Yığındaki elemanlar.
Console.WriteLine("\nYığındaki elemanlar: ");
ElemanlariYaz(yigin);
//Contains() metodunun kullanımı:
if(yigin.Contains("Sefer"))
Console.WriteLine("\nYığında Sefer elemanı var...");
else
Console.WriteLine("\nYığında Sefer elemanı yok...");
int elemanSayisi= yigin.Count;
Console.WriteLine("\nYığınımızdaki eleman sayısı: {0}", elemanSayisi);
// Yığındaki elemanlar.
Console.WriteLine("\nYığındaki elemanlar: ");
ElemanlariYaz(yigin);
//Contains() metodunun kullanımı:
if(yigin.Contains("Sefer"))
Console.WriteLine("\nYığında Sefer elemanı var...");
else
Console.WriteLine("\nYığında Sefer elemanı yok...");
// Yığını boşaltalım.
yigin.Clear();
yigin.Clear();
// Yığını boşalttıktan sonra kaç tane eleman bulunduğunu
bulup yazalım.
elemanSayisi= yigin.Count;
Console.WriteLine("\nYığınımızdaki eleman sayısı: {0}", elemanSayisi);
elemanSayisi= yigin.Count;
Console.WriteLine("\nYığınımızdaki eleman sayısı: {0}", elemanSayisi);
Console.ReadLine();
}
}
public static void ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
Hemen üstteki programdan önceki programda yığınımıza int tipinden
nesneler (c#'ta primitive türler dahil herşey nesnedir!) yerleştirmiştik. Bu
örnekte ise string sınıfına ait nesneleri yığınımıza ekledik ve onlar üzerinde
işlemler yaptık. Yani yığın sınıfımız herhangi bir nesneyi tutabilecek
yetenekler sabit. İster temel veri türleri olsun (int, byte, double veya bool)
ister kendi tanımladığımız veri türleri olsun yığın sınıfımıza ekleyip çıkartabiliriz.
Yukarıdaki programda yigin olarak oluşturduğumuz ve yığın sınıfındaki
nesnemize beş tane veriyi ekliyoruz. Sonra yığında kaç tane eleman olduğunu
bulmak için Count özelliğinden faydalanıyoruz. Yığındaki elemanları yazdırmak
için ElemanlariYaz() sabit fonksiyonumuzu kullanıyoruz. Contains() metodunu kullanımına
örnek olması amacıyla if deyimi içinde yigin.Contains("Sefer")
sorgusunu yapıyoruz. Eğer Sefer elemanı yığında
mevcutsa ekrana yığında olduğunu, yoksa yığında olmadığını yazdırıyoruz.
Programın geriye kalan kısmında yığını boşaltmak için Clear() metodunu kullanıyoruz,yığındaki
eleman sayısını tekrar bulup bunu yazdırıyoruz. Eğer tekrar ElemanlariYaz()
fonksiyonunu kullansaydık. "Yığın Boş..!" uyarısını alırdık!
.NET sınıf kütüphanesinde bulunan Yığın (Stack) sınıfının
getirdiği kolaylıklar yukarıdakilerden daha fazladır. Mesela herhangi bir yığın
nesnemizi başka bir yığının içine kopyalayabiliriz. Bir yığını başka bir yığına
kopyalamak için Clone() metodunu kullanabiliriz. Ayrıca bir yığın nesnesini
herhangi bir dizinin içine kopyalamak için ToArray() metodu kullanılabilir. İki
tane yığının birbirlerine eşit olup olmadığını öğrenmek için Equals() metodu
hemen yardımımıza yetişir. Burada şunu belirtmekte yarar var: Equals() metodu
sanal (virtual) bir fonksiyon olup c#'daki tüm nesnelerin türediği System.Object
nesnesine aittir.
Bu makalede inceleyeceğimiz son program aşağıdadır. Bu
programla Clone(), Equals() ve ToArray() metodlarını programlarımız içinde ne şekilde
kullanacağımızı öğrenebiliriz.
using System;
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
using System.Collections; // Stack sınıfı bu isim alanı içinde bulunur.
class YiginSinifi1
{
public static void Main(string[] args)
{
// Stack sınıfından yigin nesnemizi tanımlıyoruz.
Stack yigin1 = new Stack();
// Yığınımıza yeni elemanlar ekliyoruz.
yigin1.Push("Ahmet");
yigin1.Push("Sefer");
yigin1.Push("Cemal");
yigin1.Push("Onur");
yigin1.Push("Aziz");
yigin1.Push("Ahmet");
yigin1.Push("Sefer");
yigin1.Push("Cemal");
yigin1.Push("Onur");
yigin1.Push("Aziz");
//İkinci yığınımızı tanımlıyor ve yigin1'in
// bir kopyasını yigin2'ye koyuyoruz..
Stack yigin2= (Stack)yigin1.Clone();
// bir kopyasını yigin2'ye koyuyoruz..
Stack yigin2= (Stack)yigin1.Clone();
// yigin1'den bir eleman çıkartıyoruz.
yigin1.Pop();
yigin1.Pop();
//yigin1 ve yigin2 nesnelerimizin en üstteki
// elemanlarına bir bakalım:
Console.WriteLine(" Peek of Yığın2: "+ yigin2.Peek());
Console.WriteLine(" Peek of Yığın1: "+ yigin1.Peek());
// elemanlarına bir bakalım:
Console.WriteLine(" Peek of Yığın2: "+ yigin2.Peek());
Console.WriteLine(" Peek of Yığın1: "+ yigin1.Peek());
//yigin1 ve yigin2 eşit mi? Bir bakalım:
Console.WriteLine("\n yigin1 ve yigin2 eşit? --> "+ yigin1.Equals(yigin2));
Console.WriteLine("\n yigin1 ve yigin2 eşit? --> "+ yigin1.Equals(yigin2));
//yigin2'yi kopyalamak için yeni bir dizi oluşturalım:
Array arr = new Array[5];
Array arr = new Array[5];
// yeni oluşturduğumuz diziye yigin2'yi kopyalayalım:
arr = yigin2.ToArray();
arr = yigin2.ToArray();
// arr nesnesinin elemanları:
Console.WriteLine( "\n\n arr nesnesinin elemanları:\n"+
"\n\t"+arr.GetValue(0)+
"\n\t"+arr.GetValue(1)+
"\n\t"+arr.GetValue(2)+
"\n\t"+arr.GetValue(3)+
"\n\t"+arr.GetValue(4) );
Console.WriteLine( "\n\n arr nesnesinin elemanları:\n"+
"\n\t"+arr.GetValue(0)+
"\n\t"+arr.GetValue(1)+
"\n\t"+arr.GetValue(2)+
"\n\t"+arr.GetValue(3)+
"\n\t"+arr.GetValue(4) );
Console.ReadLine();
}
}
public static void ElemanlariYaz(Stack yigin)
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
{
object obj = new Object();
Stack yeniYigin = (Stack)yigin.Clone();
if(yigin.Count!=0)
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
{
while(yeniYigin.Count>0)
{
obj = yeniYigin.Pop();
Console.WriteLine("\t"+ obj.ToString());
}
}
else Console.WriteLine("Yığın boş...!");
}
}
Yazımızda bilgisayar programlama alanında en önemli
veri yapılarından biri olan yığınların (Stack) nasıl çalıştıklarını ve .NET sınıf
kütüphanesinde bulunan Stack sınıfını ve metodlarının nasıl işimize yarayacak şekilde
kullanabileceğimizi öğrendik. Umarım bu yazının size gerçek manada yararı olur.
Hiç yorum yok:
Yorum Gönder