Home / Veri Yapıları / Kuyruk Veri Yapısı (Dizi ile)

Kuyruk Veri Yapısı (Dizi ile)

Kuyruk veri yapısı Veri Yapıları arasında en öne çıkanlardan bir tanesidir. Mantalite olarak ilk giren elemanın ilk çıkması gözetilir. Yani First In First Out yapısı mevcuttur.

Kuyruk veri yapısını gerçek hayattaki kuyruk gibi düşünebilirsiniz, kuyruğun en önündeyseniz ilk sizin işiniz biter, kuyruğun ne kadar gerisindeyseniz işiniz o kadar gecikecektir. ATM kuyrukları, ekmek kuyrukları vs…

Peki bilgisayar ortamında kuyruk veri yapısını nasıl tutabiliriz? Bizim işimiz bilgisayara bu işlemi yaptırmak üzerinedir. Kuyruk veri yapısında da, Stack veri yapısında olduğu gibi iki model kullanılır. Birincisi Dizi ile, diğeri bağlı liste ile kuyruk yapısını tutmak üzerinedir.

Kuyruk veri yapısını oluştururken tutmamız gereken iki önemli bilgi bulunmaktadır. Bunlardan birincisi en öndeki elemanı tutan Front bilgisi, diğeri ise kuyruğun en sonundaki elemanı tuttuğumuz Rear elemanıdır.

Mantık basittir, Kuyruğa yeni giren eleman, kuyruğun mevcut durumda en arkadaki elemanının (Rear) arkasına gelir ve en sondaki kişi güncellenerek kuyruğa yeni giren kişi olur. Eğer kuyruktan çıkış olmadıysa en öndeki eleman (Front) değişmez, Front değeri kuyruğa ilk eleman eklendiğinde oluşturulur. Kuyruktan eleman çıktıkça güncellenir. Aşağıdaki yapıya göz atalım.

|Front|  =====================  |Rear|

Ahmet => Ayşe => Buse => Rabia => Tankut

Kuyruğa Saliha kişisini ekleyelim.

|Front|  ============================   |Rear|

Ahmet => Ayşe => Buse => Rabia => Tankut => Saliha

Gördüğünüz üzere Front değeri değişmezken, Rear değeri bir arttı. Şimdi kuyruktan bir kişi çıkaralım.

|Front|  =====================   |Rear|

Ayşe => Buse => Rabia => Tankut => Saliha

Kuyruktan bir kişi çıkardığımızda Front değeri Ayşeye geçti. Rear ise değişmedi, o hala en sonda.

Diziler ile Kuyruk Veri Yapısı Oluşturma

Diziler ile kuyruk veri yapısı oluştururken dizinin boyutunu ve boş olma durumunu mutlaka kontrol etmemiz gerekir. Dizinin limiti dolduysa yeni eleman eklenmesini engellememiz gerekir. Yine dizi tamamen boşken kuyrtuktan eleman çıkarmamızın önüne geçmemiz gerekiyor.

Diziler ile kuyruk veri yapısı oluştururken karşımıza bir sorun çıkacak, eleman ekleme ve çıkarma işlemlerinden sonra kuyruğa eleman ekleyemiyor olacağız, bunun nedeni dizinin boş elemanlarını yazdığımız program kodunun göremiyor olması olacak. Bu konu Dairesel Kuyruk veri yapısının konusudur, bu duruma bu yazıda değinmeyeceğiz.

Dizi ile Kuyruk Veri Yapısı Oluşturma C Kodu

Aşağıda sizinle dizi ile kuyruk veri yapısı oluşturmayı gösteren basit bir C Kodu paylaştım. Güzel ama ingilişçe demeyin, sürekli bununla muhattap olacaksınız 🙂 İlgili açıklama satırları mevcuttur (onlar Türkçe 🙂 )


#include <stdio.h>

//Dizi boyutunu 5 olarak belirttim.
#define QUEUESIZE 5

//dizimiz 5 elemanlı olacak dizi[4] 0 1 2 3 4
int Queue[QUEUESIZE - 1];
//İlgili konuda size front ve rear elemanlarını tutmaktan bahsetmiştim, varsayılan değerleri -1 olacak.
int frontElement = -1, rearElement = -1;

//kuyruğa eleman ekleme fonksiyonu
void enQueue(int item)
{
    //Kuyruk eğer dolu ise hata çıktısı veriyoruz
    if(rearElement > 4)
    {
        printf("\n *********************************************\n");
        printf("\n Your Queue is Full, pls dequeue an element... ");
    }
    else
    {
        if(frontElement == -1)
        {
            //Eğer kuyrukta hiç eleman yoksa front indisini bir artırıyoruz ki dizinin 0. indisine eleman ekleyebilelim.
            frontElement = frontElement + 1;
        }
        //Eleman ekleyince en sondaki eleman 1 artar
        rearElement = rearElement + 1;
        //En arkadaki indise yeni elemanımızı yerleştiririz.
        Queue[rearElement] = item;
    }
}

//Kuyruktan eleman çıkaran fonksiyon
void deQueue()
{
    //İki kontrol yaptığımıza dikkat edin, en öndeki eleman, en arkadaki elemanın arkasında olamaz :)
    if(frontElement == -1 || frontElement > rearElement)
    {
        printf("\n *********************************************\n");
        printf("\n Your Queue is Already Empty, Please Enqueue an item");
    }
    else
    {
        //En öndeki elemanın indisini bir artırınca kuyruktan eleman çıkarmış oluyoruz. 
        //Ama unutmayın, bu bir probleme neden olacak, çözümü dairesel kuyruk'ta.
        frontElement = frontElement + 1;
    }

}

void printQueue()
{
    int i;
    if(frontElement == -1 || frontElement > rearElement)
    {
        printf("\n *********************************************\n");
        printf("\n Your Queue is Already Empty, Please Enqueue an item");
    }
    else
    {
        for( i = rearElement; i >= frontElement; i--)
        {
            printf(" %d \n", Queue[i]);
        }
    }
}
int main()
{
    int choise, item;
    while(1 == 1)
    {
        printf("\n 1- Enqueue element ...");
        printf("\n 2- Dequeue element ...");
        scanf("%d", &choise);

        switch(choise)
        {
            case 1:
                printf("\n Which number do you want to enqueue? ");
                scanf("%d", &item);
                enQueue(item);
                printQueue();
                break;
            case 2:
                deQueue();
                printQueue();
                break;
        }

    }
    return 0;
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir