Stack (Yığın)

İstersen buraya tıklayarak açıklamalı veya açıklamasız stack kodlarını indirebilirsin.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

/**
 * Yığın yapısı
 * @author Yunus Emre AK
 */
 
typedef struct node{
        int veri;
        struct node * altindaki;        
}Dugum;

/*  Yığın yapısında son giren ilk çıkacağı için "enUst" adında bir düğüm oluşturalım.
 * Oluşturulan bu yığın, üst üste konulan kitaplar gibi düşünülebilir.
 *
 *  
 */
Dugum *enUst = NULL;

// Yığına veri ekleme fonksiyonu.
void push(int veri){
 // İlk kez veri atama işlemi yapılmadan önce yığın düğümü oluşturulur.
 Dugum* yeniDugum;
  
 // Bellek atama işlemini yapıyoruz.
 yeniDugum = (Dugum*)malloc(sizeof(Dugum));
 
 // Veriyi atıyoruz.
 yeniDugum->veri = veri;
  
 /*  Yeni düğüm, enUst olarak ifade ettiğimiz düğümün üstünde olduğu için
  * yeni düğümün altındakini, eski enUst düğüm olarak atıyoruz.
  */
 yeniDugum->altindaki = enUst;
 
 /*  Yeni tanımladığımız düğüm artık en üstte olduğu için yeni düğümü en üste
  * atıyoruz, böylelikle ana düğüm en altta, diğer düğümler üstüne binecek şekilde 
  * veri depolanacak, yapılacak en son "altindaki" işlemi ana düğüme ulaştıracaktır.
  */
 enUst = yeniDugum;
 
}

// Yığından veri çıkarma fonksiyonu.
int pop(){
 /*  İlk olarak yığında veri olup olmadığı kontrol ediyoruz, eğer veri yoksa işlem
  * yapılamaz.
  */
 if(enUst == NULL){
   printf("\nYigin dugume sahip degil, hata!\n");
   
   // Hata kodu olması amaçlı , -1 döndürüyoruz.
  return -1;
 }
  
 // Düğümdeki veriyi geri döndürülecek olan sonuc'a atıyoruz.
 int sonuc = enUst->veri;
  
  /*  En üstteki düğüm silinmeden önce onun için ayrılan belleği serbest bırakmamız 
   * lazım, bu sebeple bellek bilgisini kaybetmemek için geçici bir düğüne atıyoruz.
   */
 Dugum *gecici = enUst;
 
 // En üstteki düğüm silineceği için, altındaki düğüm en üste gelecektir.
 enUst = enUst->altindaki;
 
 // Silinen düğüm için ayrılan belleği serbest bırakıyoruz.
 free(gecici);
 
 // düğümden aldığımız değeri ekrana döndürüyoruz.
 return sonuc;    
}

// Bütün düğüm verilerini ekrana yazdırma fonksiyonu.
void printStack(){
 /*  Ana yığının üzerinde değişiklik yapmamak için bir kopyasını oluşturuyoruz.
  *
  */
  
 Dugum *kopyaEnUst = enUst;
 
 // Görsel düzenleme için buradadır.
 printf("\n*******");
 
 // Değerler var olduğu sürece işlem devam etmeli.
 while(kopyaEnUst != NULL){
  printf("\nVeriler: %d ",kopyaEnUst->veri);
  
  /*  En üstteki veriye baktıktan sonra bir altındakinin bakmak için altındakini
   * en üste alıyoruz.
   */
  kopyaEnUst = kopyaEnUst->altindaki;
 }
 
 // Görsel düzenleme için buradadır.
 printf("\n*******");
}

int main(){
 int x = 10;
 for(x; x < 50; x+=10){
  push(x);
  printf("\n%d verisi eklendi",x);
  printStack();
 }
 
 int a,i = 1;
 
 for(a = pop(); i < 5; a = pop()){
  printf("\n%d verisi cikarildi.",a);
  
  printStack();
  i++;
 }
 
 push(30);
 printf("\n30 verisi eklendi");
 printStack();
}

Veri Yapıları

Yorumlar

Popüler Yayınlar