Queue (Sıra) kodlaması ve Dizi (Array) kullanımı (Veri Yapıları 9.2)
Vložit
- čas přidán 7. 09. 2024
- Veri Yapıları altında, Soyut veri tipi (abstract data type) olan sıra (queue) için enqueue ve dequeue fonksiyonlarının dizi (array) üzerinde kodlanmasıve bu sırada yaşanan problemlerin çözümü. C dili ile kod geliştirilmesi.
Şadi Hocanın Anlattığı kod arkadaşlar :
#include
#include
int *array = NULL; // Neden null ?
int first=0, last=0, size=2;
int dequeue(){ // Eleman çıkarma
if(last==first){
printf("Queue is empty");
return -1;
}
if(last-first
Hocam sizi izlemediğim gün kötü geçiyor. Her videoda değerli bilgilerinizden faydalanıyorum. Elinize sağlık :D
28:16 video dondu zannetim :D
Hocam ellerinize sagilik algorithm videolari gibi veri yapilari videolarida muazzam olmus.
Öncelikle çoğu videonuzu severek izledim.Bu videoda kendi üni hocalarımdan ogrendıgım birşeyi eklemek istiyorum. Dizinin eleman sayısını yukseltmedıgımız durumlarda da deque edılmıs yerlerdeki boşlukları da kullanmak için şu yöntem kullanılabilinir. Sıra başı ve Sıra şuanki dizinin boyutu -1 ; olarak tanımlanır. enque de ise: sıra =( sıra+1) % suankidiziboyutu; dizi[sira] = eklenicekdeger; olarak tanımlanır. deque de ise sırabaşı=(sırabaşı+1) %suankidiziboyutu; olarak tanımlanır.
Sanırım buna çevrimsel kuyruk deniyor.
hocam hiçbir şey anlamadım ama teşekkürler sorun bende maalesef
toparla fonksıyonunda for dongusunde boyut yerıne sira-1 e kadar gıtmesı daha mantıklı degıl mı ? sonucta dızı tam dolu olmadıgında boyuta kadar gıttıgınde gereksız yere ıslem yapmıs oluyor
kolay gelsin hocam toparla fonsiyonunu deque nun icine yazsak her deque edişinde diziyi toparlasa daha kolay olabilir mi ?
belli aralıklarla toplarla yazmak yerine, hızdan kaybetsek bile, her deque de elemanları 1 sola kaydırıp sırayı bir azaltırsak hiç boşluk olmamış olur. daha sağlam olur
@@berkencan33 Verim açısından zararı olabileceğini düşünüyorum. Gerektiği anlarda çağırmak daha verimli olur. Her deque'da 20 elemanı bir sağa kaydırmak yerine dizi sınırına yaklaştığında 20 elemanı 5 adım oynatmak daha az iş yükü oluşturur. Bu dediğim de kontrol edilirse şart sağlandığı anda kod çalışmış olur.
Merhaba hocam. Eğer iki timer kullanılsa ve bu iki timer'dan biri bilgi geldiğinde enque() , ötekide bilgi geldiğinde deque() yi çalıştırsa. bu iki fonksiyonun aynı anda çalışma ihtimali doğar. Aynı anda çalışma halinde bile yazdığınız kod sırayı karıştırmadan tutar mı?
Şeyi tam kavrayamadım : Neden iki katına çıkarıyoruz ? Daha kolay bir şekilde yer açalım diye mi ? İstesek 10 luk yer ayırabilir miyiz ? Biz istediğimizi değil de 2 ' nin katlarını ayırabiliyoruz ...
Teşekkürler.
Hocam merhaba sizin malloc ile yaptığınız şeyi biz derste circular queue ile yaptık bu ikisi benzer şeyler mi? Birbirlerinin yerlerine kullanılabilir mi? Teşekkür ederim.
Olum aslında düşününce kolay lan :D
merhaba hocam.diziyi silme işlemini heap te yaparsak kod tasarrufu sağlanırmı?
Hocam toparla fonksiyonunda bir segmentasyon hatası beklemiştim açıkçası ama yaşanmadı. Toparla içindeki for döngüsünde özellikle dizi[i + sirabasi] kısmında indis dizi boyutunu aşmıyor mu? Bu noktada C üzerinde bir kontrol yok mu acaba?
Aynı hatayı ben de bekledim ama hata çıkmadı, o kısıma anlam veremedim.
Hocam bizim dersimizde de hocamız aynı bu şekil bellekte boyut*2 kadar yer açtırıyordu ama bu belleği gereksiz işgal etmez mi ? Misal (int*)malloc(sizeof(int)*boyut) desek enque yapmadan önce boyut++ yapsak daha doğru olmazmı bu sayede her eleman eklediğimizde onun boyutu kadar yer açılır ve bellekten tasarruf edilir deque işleminde de aynı şekilde boyut-- yapabiliriz ?
Her eleman eklendiğinde kopyalama yapacağımız için bu seferde zamandan kaybederiz dostum , şimdi boyut/2 tane eleman eklenince yeni yer açılıp kopyalama işlemi yapılıyor
@@mustafakarakas1116 Eyvallah , güzel bir açıklama olmuş bende neden 2 ile çarptığımızı düşünüyordum.
@@mertpehlivan3663 kolay gelsin hocam
Bence queue kelimesini “kuyruk” diye çevirmek lazım. Kuyruğa girmek gibi
türkçesi zaten kuyruk
merhabalar hocam ,diziyi 2 katına çıkarmadan başka kullanılabilecek önerileriniz var mı ödev maksatında uğraşabileceğimiz?
diziyi sabit boyutlu hafıza ayırma (memory allocation) olarak kabul ettiğimiz için sonuçta veri büyüdükçe daha büyük bir veri yapısına geçmeniz gerekiyor. Bu noktada istatistiksel bazı yaklaşımlar kullanılabilir ama bence bunlarla uğraşmayın. Amacınız veri yapılarında uygulama yazmaksa, gerçek projeler yapın. Mesela ben bu dersi alırken benim projem solitaire yazmaktı. 52 kağıttan oluşan bir desteyi solitaire oyunundaki gibi veri yapılarında tutup oynatmaya izin veren bir sistem geliştirin derim.
Başarılar dilerim.
diziye sadece bir eleman eklersek nasıl olur. her bir datanın boyutuna bakarak, onu eklemek ?
diziyi küçültürken de null gördüğü yerden sonrayı almamak, yani her seferinde dizinin boyutunu eleman sayısı kadar tutmak . zaman açısından kötü, hafıza açısından en iyi sonuç olur bence.
Hocam normalde c dilinde for döngüsünde "int i = 0" ifadesini kullana mıyoz ama siz kullandınız. ??
evet C90 standartlarına aykırı, bir iki videomuzdan bundan bahsettik. Kullandığımız derleyicilerin çoğu C++ da desteklediği için arada böyle şeyler kaçıyor :) Yani bu videoların amacı katı bir C kodlaması anlatmak değil, daha çok veri yapıları kavramlarını anlatmak olduğu için biraz esnek olarak kodladım, mesela aynı kodları çok ufak değişikliklerle C++ için de kullanabilirsiniz.
29:23