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();