Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Ahmet Faruk Nacaroğlu
Ahmet Faruk Nacaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
40 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Ahmet Faruk Nacaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 14.2.2003
Okunma Sayısı : 52200
Yorum Sayısı : 6     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 10.8.2022
Turhal Temizer
Mac OS/X Removing CUDA 10.8.2022
Burak Selim Şenyurt
Rust Pratikleri - Value Moved Here 10.8.2022
Burak Selim Şenyurt
Rust Pratikleri - State Tasarım Kalıbı 10.8.2022
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Her Yönüyle C#'da Yığın (Stack) Sınıfı
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
ARA
16
2016
Çok güzel anlatmışsınız, elinize sağlık. (Sırf yorum yapabilmek için siteye üye oldum) Çok teşekkürler.
EYL
5
2012
Çok güzel bir anlatım. Ayrıca animasyon da güzel fikir olmuş.
KAS
23
2011
Konu hakkında gereken temel bilgileri anlaşılır bir şekilde veren bi anlatım.. TEŞEKKÜRLER=)
EYL
3
2009
anlaşılır ve güzel bir makale olmuş.Teşekkürler:)
AĞU
6
2004
Teşekkürler
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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