Pazar Kasım 3rd, 2019

Stack

ile Ebubekir Sezer

Merhabalar, Stack bir Abstract Data Type(ADT) yani Soyut Veri Tipindedir. Stack’lerde Son giren ilk çıkar(Last in First Out) veya ilk giren son çıkar(First in Last Out) şeklinde tanımlanır. Stackleri arraylerle veya linked list’lerle beraber kullanabiliriz. Ben bu örneğimde arrayler ile birlikte kullanacağım. Stack’in sahip olduğu 3 adet fonksiyonu ve geri döndüren özelliği vardır diyebiliriz. Bunlar;

  • Push : Stack’e eleman eklememizi sağlar.
  • Pop : Stack’den eleman silmemizi sağlar.
  • Top : Stack’in en üstteki elemanı geri döndürür.

Tanımlamalarımızı yaptıktan sonra kodlamaya başlayabiliriz. İlk olarak bir tane yapı tanımlıyorum ve bu yapı içerisinde boyut, en üstteki eleman ve dizi’yi tutacak şekilde stack yapımı tanımlıyorum.

//Representing the Stack
typedef struct s{
	int size;
	int top;
	int *array;
}stack;

Stack oluşturmak için stack döndürecek bir tane fonksiyon yazıyorum ve bu fonksiyonda stack içerisindeki array’in boyutunu’da alıyorum. #include<stdlib.h> kütüphanesindeki malloc fonksiyonunu kullanarak hafızada stack kadar yer açıyorum ve aynı işlemi array içinde yapıyorum ama array’in hafızdaki yerini aldığımız boyut ile oluşturuyorum.

//Creating a stack
stack *createStack(int size){
	stack *mystack = (stack *)malloc(sizeof(stack));
	mystack->size = size;
	mystack->top = 0;
	mystack->array =(int *)malloc(sizeof(int)*size);
	return mystack;
}

Stack’e veri eklemek için Push fonksiyonu yazıyoruz, bu push fonksiyonunun void olarak tanımlıyorum çünkü herhangi bir şey döndürmeyecek. Fonksiyonu oluşturduktan sonra bazı kontroller yapmamız lazım. Mesela eğer array full dolmuş ise array’in boyutunu tekrar arttırmamız lazım. Bunun için geçici bir array2 adında bir array oluşturuyorum ve değerlerimi ona atıyorum. Daha sonra ilk array’imi free fonksiyonunu kullanarak hafızadan siliyorum ve daha sonra bu array’i array2’ye eşitliyorum.

//Adding item to the stack
void push(stack *mystack,int data){
	if(mystack->top >= mystack->size-1){
		int *array2 = (int *)malloc(sizeof(int)*mystack->size*2);
		
		for(int i =0;i<mystack->size;i++){
			array2[i]= mystack->array[i];
		}
		free(mystack->array);
		mystack->array = array2;
		mystack->size *=2;
	}
	mystack->array[mystack->top++] = data;
}

Stack’den veri silmek için ise Pop fonksiyonu yazıyoruz, Pop fonksiyonun’da integer değer döndürüyoruz. Pop fonksiyonu içerisinde yaptığımız kontrol, eğer array’in en üsttünde bulunan eleman array’in boyutunundan 4 kat küçük ise array’in boyutunu küçültüyoruz ve değerlerini geçiçi bir array oluşturup ona atıyoruz. Daha sonra array’i  geri döndürüyoruz.

//Deleting item from stack
int pop(stack *mystack){
	if(mystack->top <= mystack->size/4){
		int *array2 = (int *)malloc(sizeof(int)*mystack->size/2);
		for(int i=0;i<mystack->top;i++){
			array2[i]=mystack->array[i];
		}
		free(mystack->array);
		mystack->array = array2;
		mystack->size /=2;
	}
	return mystack->array[--mystack->top];
}

Ben Stack’deki en üstteki elemanın kaçıncı sırada olduğunu görmek için topValue adında bir fonksiyon oluşturuyorum ve bu fonksiyon ile en üstteki verinin sırasını gönderiyorum.

//Returing top value
int topValue(stack *mystack){
	int top = mystack->top;
	return top;
}

Bütün bu işlemleri yaptıktan sonra bunları bastırmak için bir fonksiyon oluşturuyorum. Bu fonksiyon içerisinde Stack’in boyutunu, en üstteki verinin yerini ve Stack’deki elemanları bastırıyorum.

//Showing items of the Stack
void show(stack *mystack){
	printf("Size : %d\n",mystack->size);
	printf("Top Value : %d\n",topValue(mystack));
	for(int i =0 ;i<mystack->top;i++){
		printf("%d ",mystack->array[i]);
	}
	printf("\n\n");
}

Artık her şeyimiz hazır sadece main fonksiyon içerisinde stack oluşturmalıyız.

int main(){
	stack *s1= createStack(2);
	
	stack *s2 = createStack(4);
	
	push(s1,10);
	push(s1,20);
	push(s1,30);
	push(s1,40);
	show(s1);
	pop(s1);
	show(s1);
	push(s2,1);
	push(s2,2);
	push(s2,3);
	push(s2,4);
	show(s2);
}

Soru ve görüşlerinizi e-mail veya yorum olarak belirtirseniz sevinirim.