C DERS 26: STACK DYNAMIC

Bellekten dinamik olarak (el ile) yer ayırıp, veri ekleme ve okuma yapacağız.

Static(yığın) bellekte Last In First Out kuralı vardır. Yani veriyi okumak

istersek son girilen değer ilk okunur. Bu sefer sadece main.c ile değil

oluşturacağımız 2 dosya ile daha çalışacağız.

main.c, stackdynamic.c(bellekten yer alma ve veri ekleme),

stackdynamic.h(fonksiyonların deklarasyonları)  dosyalarımız olacak.

main.c

//sol tarafta projecten projenin adına sağ tıklayıp new file yapıyoruz
//stackdynamic.c ve stackdynamic.h oluşturuyoruz

#include <stdio.h>
#include <stdlib.h>
#include "stackdynamic.h"

int i=0;
int sayi=0;
int main() {
	do
	{
		printf("sayi gir:");
		scanf("%d",&sayi);
		push(sayi); //sayıyı push fonksiyonuna gönderiyoruz
                //ekleme işlemi için
	}while(sayi>0); // 0 girilene kadar sayı giriyoruz
	while(!empty()) //girdiğim sayılar bellekten boşalmadığı sürece
        //pop fonksiyonuyla okuyup ekrana yazdırıyoruz
	{
		printf("%d",pop());
	}
	return 0;
}

stackdynamic.c

#include <stdio.h>
#include <stdlib.h>
#include "stackdynamic.h"
int *stack;
int i=0;
void push(int veri)
{
//belleğimizi tmp adında geçici bir pointera attık çünkü yer ayırmak
//istediğimizde vermez ise eski aldığımız veriler de gider.
	int *tmp=(int*)realloc(stack,sizeof(int)*(i+1));
//Aldığım bellek boyutunu 1 artırdım. İlk değer 0 olduğundan 1 tane int
//türünde yer alıyoruz veri girdikçe bellekten aldığımız yer de artıyor.
//(tabi belleğin bize verdiği alan kadar) böylece dinamik olarak biz veri
//girdikçe bellekte yer açıyoruz.
	if(tmp==NULL)
	{
		return;
        //bellekten yer alabildikmi diye bakıyoruz alamadıysak
        //fonksiyondan çıkıyoruz.
	}
	stack=tmp; //yer alabildiysek artık geçici değişkenden kendi
        //pointerımıza alıyoruz.
	stack[i++]=veri;//stack 'a veriyi atayıp boyutunu 1 arttıyoruz.
}
int pop()
{
	int tmp= stack[--i]; //pushta en son arttırdığımız için son
        //veriye ilk önce i'yi eksiltip ulaşıyoruz
	stack=(int*)realloc(stack,sizeof(int)*(i));
	return tmp;
}
int empty()
{
	return i==0;
}

stackdynamic.h

void push(int veri); //kullandığımız fonksiyonların deklarasyonları
int pop();
int empty();