|
Her Yönüyle C#'da Yığın (Stack) Sınıfı |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu yazımızda önemli
veri yapılarından olan yığın (Stack) veri yapılarına giriş yapacağız. Yığın
veri yapılarının çalışma mantıklarını anladıktan sonra .NET sınıf kitaplıklarında
yeralan Stack sınıfını C#'da nasıl kullanacağımızı inceleyeceğiz.
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.
|
2. .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.
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);
//
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);
//
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);
//
Ş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);
Console.ReadLine();
}
public static void ElemanlariYaz(Stack
yigin)
{
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ş...!");
}
}
|
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.
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");
//
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...");
//
Yığını boşaltalım.
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);
Console.ReadLine();
}
public static void ElemanlariYaz(Stack
yigin)
{
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ş...!");
}
}
|
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.
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");
//İkinci
yığınımızı tanımlıyor ve yigin1'in
//
bir kopyasını yigin2'ye koyuyoruz..
Stack
yigin2= (Stack)yigin1.Clone();
//
yigin1'den bir eleman çıkartıyoruz.
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());
//yigin1
ve yigin2 eşit mi? Bir bakalım:
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];
//
yeni oluşturduğumuz diziye yigin2'yi kopyalayalım:
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.ReadLine();
}
public static void ElemanlariYaz(Stack
yigin)
{
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ş...!");
}
}
|
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.
Makale:
Her Yönüyle C#'da Yığın (Stack) Sınıfı C#, Visual C# ve .NET Ahmet Faruk Nacaroğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|