Kapat
Anasayfa 21 0

Veri Yapılarına Dair #4

Veri Yapılarına Dair #4 yazımızda kuyruk veri yapısına dair bilgiler bulabilirsiniz.

Doğrusal Veri Yapıları 4 - Kuyruk (Queue) | by Tolgahan Çepel | Medium

Kuyruk (Queue)

Kuyruk veri yapısında eleman eklemeleri sondan (rear) ve eleman çıkarmalarının baştan (front) yapılmaktadır. Bu nedenle kuyruk veri yapısına FIFO(First In First Out-İlk Giren İlk Çıkar) veya LILO (Last In Last Out -Son Giren Son Çıkar).

Bunu fırının önünde sıraya giren müşteriler olarak düşünebiliriz sıraya müşteri geldiği zaman en sona gelir. İşi biten müşteride en öndeki kişidir ve oradan gider. Bankada sıra bekleyen kişiler de Kuyruk veri yapısına girmektedir. Bu örnekleri daha da çoğaltabiliriz.

Kuyruk (queue) yapısı bilgisayar alanında; ağ, işletim sistemleri, istatistiksel hesaplamalar, simülasyon ve çoklu ortam uygulamalarında yaygın olarak kullanılmaktadır. Örneğin, yazıcı kuyruk yapısıyla işlemleri gerçekleştirmektedir. Yazdır komutu ile verilen birden fazla belgeden ilki yazdırılmakta, diğerleri ise kuyrukta bekletilmekte, sırası geldiğinde ise
yazdırılmaktadır

Kuyruk veri yapısı bir sabit dizi olarak gösterilebilir veya bir bağlı liste olarak tanımlanabilir.

Kuyruk Üzerinde temelde 2 işlem gerçekleştirilir;
▪ enqueue (object), bir nesneyi kuyruğun en sonuna ekler (insert).
▪ object dequeue(), Kuyruk başındaki nesneyi getirir ve kuyruktan çıkarır (remove veya delete).

Dizi ile Kuyruk Tasarımı

Dizi ile kuyruk oluşturmak için yapılması gereken iki temel işlem vardır. Bu işlemlerden birincisi kuyruğa eleman eklemek, ikincisi ise kuyruktan eleman çıkarmaktır.

Kuyruğun eleman sayısını tutan bir değişken, kuyruğun başını gösteren bir değişken ve kuyruğun sonunu gösteren bir değişken olmak üzere üç adet int türden değişken ile saklanacak verinin türüne uygun bir dizi bulunur.

#include <stdio.h>
#define maxCapacity 5

int queue[maxCapacity],front=-1,rear =-1,currSize=0;

void enQueue(int data) {
    if(currSize==maxCapacity){
        printf("\n Queue was full cant't do insertion");
    }
    else
    if(front==-1){
        front=currSize=0;
        rear=maxCapacity-1;
    }
    rear=(rear+1)%maxCapacity;
    queue[rear]=data;
    currSize=currSize+1;
    printf("%d added to the queue at array pos : %d\n",data,rear);
}
void deQueue(){
if(currSize==0)
    printf("\n Queue was Empty !!! Couldn't delete");
else{
    printf("\n Dequeued : %d",queue[front]);

    int item =queue[front];
    front =(front+1)%maxCapacity;
    currSize=currSize+1;
    printf("%d dequeued from queue,new front is at pos : %d\n",item,front);
}
 }
void display(){
if(rear==-1)
    printf("\n Queue was Empty !!!");
else
{
    int i;
    printf("\n Queue : \n ");
    for (i=front; i<= rear;i++)
        printf("%d",queue[i]);
}
 }
int main (){
enQueue(10);
enQueue(20);
enQueue(30);
enQueue(40);
deQueue();
deQueue();
enQueue(50);
enQueue(60);
return 0;
}

Bağlantılı Liste ile Kuyruk Tasarımı

Kuyruğun başını ve sonunu gösteren struct node türden iki işaretçi ile eleman sayısını tutan int türden bir counter’ı bulunur. Kuyruğun başını gösteren işaretçi her veri çıkarıldığında bir sonraki veriyi gösterir.
Kuyruğun sonunu gösteren işaretçi ise her veri eklendiğinde yeni gelen veriyi gösterecek şekilde değiştirilir.

Ekleme(add) işlemi, son adresindeki verinin arkasına eklenir. Tail(diğer örneklerdeki adı ile rear) değeri, eklenen son node’ ın adresine eşitlenir.
Çıkarma (get) işlemi, ilk düğümün kuyruktan çıkarılması ile yapılır. Head (diğer örneklerde front) değeri eklenen ilk node’ un adresine eşitlenir.
Bellekte yer olduğu sürece kuyruk uzayabilir.

#include <stdio.h>
#include <stdlib.h>
#define limit 200

typedef struct KUYRUK {
    int sayi;
    struct KUYRUK *sonraki;
} kuyruk;
kuyruk *ilk = NULL, *son, *yeni, *sil;
void menu();
void ekle(int);
void cikar();
void bekle();
void listele();
void ekranTemizle();
int main() {
    while (1) {
        menu();
    }
    return 0;
}
void menu() {
    int sayi;
    printf("******Menu******\n");
    printf("1)Ekle\n");
    printf("2)Cikar\n");
    printf("3)Listele\n");
    printf("4)Cikis\n");
    int secenek;
    printf("Tercih: ");
    scanf("%d", &secenek);
    ekranTemizle();
    switch (secenek) {
        case 1:
            printf("Sayi giriniz: ");
            scanf("%d", &sayi);
            ekle(sayi);
            break;
        case 2:
            cikar();
            break;
        case 3:
            listele();
            break;
        case 4:
            printf("Program Sonlandirildi!\n");
            exit(0);
            break;
        default:
            printf("Hatali Secim!\n");
    }
    bekle();
}
void ekle(int sayi) {
    yeni = (kuyruk*) malloc(sizeof (kuyruk));
    yeni->sayi = sayi;
    yeni->sonraki = NULL;
    if (ilk == NULL) {
        ilk = (kuyruk *) malloc(sizeof (kuyruk));
        ilk = yeni;
        son = ilk;
    } else {
        son->sonraki = yeni;
        son = son->sonraki;
    }
}
void cikar() {
    if (ilk == NULL) {
        printf("Kuyruk bos\n");
    } else {
        sil = (kuyruk*) malloc(sizeof (kuyruk));
        sil = ilk;
        ilk = ilk->sonraki;
        printf("%d Kuyruktan cikarildi\n", sil->sayi);
        free(sil);
    }
}
void bekle() {
    printf("Devam etmek icin Enter'a basiniz!\n");
    getchar();
    getchar();
    ekranTemizle();
}
void listele() {
    if (ilk == NULL) {
        printf("Kuyruk Bos\n");
    } else {
        kuyruk *gecici = ilk;
        while (gecici != NULL) {
            printf("%d ", gecici->sayi);
            gecici = gecici->sonraki;
        }
        printf("\n");
    }
}
void ekranTemizle() {
    system("cls");
}

Veri Yapılarına Dair #4 yazımızı burada bitirmiş bulunmaktayız. Veri Yapılarına Dair#3 yazımızı okuyarak genel bilgiye sahip olabilirsiniz.

Yazılarımı okumak isterseniz buraya tıklayınız.

[Toplam: 0   Ortalama: 0/5]
Hatice Nur Kaya

Hatice Nur Kaya {Hatice Nur Kaya}