Skip to main content

C İle Veri Yapıları : Kuyruk Ve Kuyruk İşlemleri

Bundan önceki yazımda temel veri yapılarından biri olan Yığın (Stack) kavramına göz atmıştık.  Stack   tek yönlü bir veri yapısıydı,  bir  yığına ilk giren eleman  , yığından en son çıkan eleman oluyordu. Kuyruk   ise yine temel veri yapılarından bir tanesidir.  Aslında günlük hayatta belkide farkında olmadan kullandığımız bir yapı.  Örneğin bir hastahanede muayne olmak isteyen hastaların sırasını göze alalım.  Bu sıraya dahil olmak isteyen hastalar  en sondan  kuyruğa dahil olmak zorundadır. Aynı şekilde   doktor muayne olacak hastayı en önden   çağırmaktadır.   Kısaca diyebiliriz ki , bir kuyruğuna eleman eklerken sondan , eleman çıkartırken önden  işlem yapacağız.

Bu durumda böyle bir yapı tanımlarken   kuyruğun önü ve arkasını gösteren  iki adresimiz olacağını çıkartabiliriz.

En basit bir kuyruk yapısını aşağıdaki gibi tanımlayabiliriz :

struct kuyruk {

int on, son;

int veri[BOYUT];

};

 

on ve son isimli değişkenler bizim kuyruğumuzun  en önü ve en arkasını gösterecekler.   Tıpkı yığınlarda  olduğu gibi  kuyrklarında bir takım  standart işlemleri var.  Bunlar :

  • Kuyruğa veri ekleme
  • Kuyruktan veri çıkarma
  • Kuyruk Listeleme
  • Kuyruk Yaratma

gibi temel işlemlerden meydana geliyor . Bu yapıların kodlarını vermeden önce  bahsedilmesi gereken iki kavram var.  Veri yapılarında kuyruklar iki şekilde kullanılır

Doğrusal Kuyruk :  En temel  kuyruk biçimidir, ama bir takım dezavantajları var.   Örneğin aşağıdaki gibi bir kuyruğumuz olduğunu düşünelim   ve bu kuyruktan   en baştaki elemanı çıkartalım .

Örneğin bu  kuyruktan elaman çıkardığımızda ( kuyruk yapısı gereği eleman  kuyruk başından çıkacaktır) , A  verisinin bulunduğu  adres boşalacaktır.   Veriyi çıkarttığımızda kuyruk başı artık B ‘dir.  Ama aslında  A  verisine ayrılan  adres alanı hala durmaktadır.  Aynı şekilde  sırayla B,C,D,E verilerini kuyruktan çıkardığımızda kuyrukta eleman kalmayacaktır, ama bu elemanlar için ayrılan alanlar sistem üzerinde   durmaya devam edecektir.  Bu da istenmeyen bir durumdur.   Bu yüzden doğrusal kuyruklar   veri yapılarında pek tercih edilmezler.    Bu veri yapısı modeli yerine  uygulamalarımızda daha çok Dairesel Kuyrukları kullanırız.

2. Dairesel Kuyruk :

Doğrıusal  Kuyruklarda meydana gelen dezavantajları gideren bir yapıdır.  Yukarı ki yapı bir çember şeklini alır,  başlagıçta   kuyruğun ön ve arkasını gösteren işaretçiler  aynı noktayı işaret ederler.  Biz kuyruğumuzu dizi yapısıyla kuracağımız için dizi yapısı için bu nokta -1’dir . Çünkü dizinin -1. indis’i yoktur. Yani diyebiliriz ki bir kuyruk oluşturken Kuyruk.on=-1; Kuyuk.arka=-1 dediğimizde kuyruğumuzu  başlangıç  durumuna getiriyoruz.

Kuyruğa veri eklemek istediğimizde  ilk olarak temel şart kuyruğun dolu olmamasıdır , bir kuyruğun dolu olabilmesi için 2 şart vardır.  Birinci şart  ön  tarafı gösteren işaretçinin en sonda olma durumudur ki n boyutlu bir kuyruk yapısı  için  dizi yapısı için  Kuyruk.on=n-1 olduğunda bu şart sağlanmış olur.  Eğer bu şart sağlanmadıysa yeni bir eleman eklemek için ön elemanı gösteren değer +1 arttırılır ve sonraki   kuyruk sırasını göstermesi sağlanır.  Bu şart kontrol edildikten sonra  İkinci şart ise   ön ve arka işretçilerin tıpkı başlangıç durumunda ki gibi birbirine eşit olması durumudur.  Eğer  Kuyruk.on=Kuyruk.arka  birbirine eşitse Kuyruk dolu’dur ve de işlem yapılamaz.  Gerekli mesaj verilir , program sonlandırılır.

Kuyruktan veri çıkartmak istediğimizde yapacağımız işlemler ise şu şekildedir. Bir kuyruktan veri çıkarmak için öncelikle kuyruğun boş olup olmadığının kontrol edilmesi gerekir.  Peki bir kuyruk nasıl boş olur ?   Ön ve arka işaretçimiz -1  durumunda olduğunda kuyruk boştur.  Bu iki işaretçii birden  biz başlangıçta   -1 eşitlemiştik ve kuyruk boş durumdaydı, hatırlayalım.   Buradan yola çıkaraj diyebiliriz ki  kuyruk.on=kuyruk.arka birbirine eşit olduğunda kuyruk boş diyebiliriz.    Kuyruğun boş olmadığını teyit ettikten sonra  Kuyruğun  ön tarafını gösteren işaretçiyi +1 artırırız  ve bir değişken vasıtasıyla çıkardığımız  elemani eman programa gönderebiliriz.

Şimdi bu anlattıklarımızın tamamını bir arada görebileceğimiz bir uygulama göstermek istiyorum.

  • Uygulama  10 elemanlı bir kuyruk uygulamasıdır.
  • Kuyruğa eleman ekler
  • Kuyruktan eleman çıkartır
  • Kuyruktaki bütün elemanları listeler
  • Kuyruktaki elemanların ortalamasını verir

 

Başka bir örnek uygulamada görüşmek dileğiyle…

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Aytaç Cici

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunu bir Yazılım Geliştirici. Çeşitli zamanlarda Java, PHP, C# ve Delphi gibi diller kullanarak yazılım geliştirmiştir. Bir dönem SEO alanında da çalışmalar yapmıştır.

C İle Veri Yapıları : Kuyruk Ve Kuyruk İşlemleri” hakkında 7 yorum

  1. slm aytaç, öncelikle blogunun ”hakkımda” kısmını güzel anlatış tarzından ötürü gülümseyerek okudum 🙂 azmine respect’i bi borç bilirim, sadece bizim okulda değil eminim sizin okuldada dgs ile gelenlere bi tepeden bakmalar vardır, ki ben buna tam karşıyım ve keşke diyorum bnmde teknik altyapım dgs ile gelenler kadar olsa 🙂 bnde ege bilg müh okuyorum 2.snfm, algoritma2 yi alttan alıyorum c de kuyruk yiğit falan bakıyordum ki internette senin yazına rastladım, eline sağlık güzel olmuş

  2. unutmadan bi de yakın zamanda bağlı liste dairesel bağlı liste , seyrek diziler hashing falan bulup eklersen çok makbule geçer kardeşim 🙂

  3. Bir kliniğe gelen hastalar doktor kontrolü için sıraya girmekte ve geliş sıralarına göre doktorun odasına alınmaktadır.
    Hastaların bir kısmı muayene olmakta bir kısmı tahlil sonuçlarını gösterip reçete yazdırmaktadır.
    Buna Göre hastanın adı soyadı ve hangi amaçla geldiği(muayene=1,reçete=2) bilgilerinden bi kuyruk yapısı
    oluştururarak 10 eleman büyüklüğündeki kuyruğa kullanıcı kontrollü olarak girdi yapan ve daha sonra bulunan
    toplam hasta sayısını recete ve muayene olan hasta sayısı yazdıran ve kuyrukta bekleyen hastaların sayısını
    yazdıran c projesi bu şekilde bi projem var işin içinden çıkamıyorum yardımcı olurmusunuz?

Bir Cevap Yazın

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

Email
Print