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