Stack ve Queue Farkı Nedir? Hangi Durumda Kullanılır?
Stack ve queue farkı, temelde verilere hangi sırayla erişildiğinde ortaya çıkar: stack (yığın) en son eklenen elemanı önce çıkarır, queue (kuyruk) ise en önce eklenen elemanı önce çıkarır. Yani stack "son giren ilk çıkar" (LIFO) mantığıyla çalışırken, queue "ilk giren ilk çıkar" (FIFO) mantığıyla çalışır. Bu tek fark bile iki veri yapısının kullanım alanlarını birbirinden tamamen ayırır: stack geri alma işlemleri ve fonksiyon çağrıları için idealdir, queue ise sıraya alınan görevler ve mesajlaşma sistemleri için tercih edilir.
Bu iki yapıyı doğru anlamak, hangi problemde hangisini kullanacağınızı seçerken kritik önem taşır. Aşağıda önce her yapıyı ayrı ayrı, sonra da aralarındaki temel farkları inceleyeceğiz.
Stack (Yığın) Nedir?
Stack, verilerin üst üste dizildiği ve her zaman en üstteki elemana erişilebildiği bir veri yapısıdır. Mantığı bir tabak yığınına benzer: en son koyduğunuz tabağı en önce alırsınız. Bu davranış LIFO (Last In, First Out - Son Giren İlk Çıkar) prensibi olarak adlandırılır.
Stack üzerinde iki temel işlem yapılır:
- push: Yığının en üstüne yeni bir eleman ekler.
- pop: Yığının en üstündeki elemanı çıkarır ve döndürür.
Bunlara ek olarak genellikle peek (veya top) işlemi de bulunur; bu işlem en üstteki elemanı çıkarmadan sadece görüntülemenizi sağlar.
Stack'in kapasitesi sınırlıysa (örneğin sabit boyutlu bir dizi ile implemente edildiyse), yığın doluyken push yapılmaya çalışılması overflow (taşma) hatasına yol açar. Benzer şekilde, yığın boşken pop veya peek yapılmaya çalışılması underflow (boşta çalışma) hatası verir. Sağlam bir stack implementasyonu her iki durumu da kontrol etmeli ve uygun hata mesajı veya exception fırlatmalıdır.
Queue (Kuyruk) Nedir?

Queue, verilerin bir sıra halinde dizildiği ve elemanların eklendiği sırayla işlendiği bir veri yapısıdır. Market kasasındaki sıraya benzer: sıraya ilk giren müşteri, ilk hizmeti alır. Bu davranış FIFO (First In, First Out - İlk Giren İlk Çıkar) prensibi olarak bilinir.
Queue üzerinde iki temel işlem yapılır:
- enqueue: Kuyruğun sonuna (arka/rear) yeni bir eleman ekler.
- dequeue: Kuyruğun başındaki (ön/front) elemanı çıkarır ve döndürür.
Bu işlemleri yönetmek için queue yapısı genellikle iki gösterge (pointer) tutar: front, çıkarılacak sıradaki elemanı işaret eder; rear ise yeni eklenecek elemanın konacağı yeri işaret eder. Dizi tabanlı implementasyonlarda bu göstergeler dairesel (circular) bir mantıkla ilerletilerek dizi alanının verimli kullanılması sağlanır. Stack gibi queue da doluyken enqueue veya boşken dequeue yapılmaya çalışılması durumunda hata kontrolü gerektirir.
Stack ve Queue Arasındaki Temel Farklar
İki yapı da eleman ekleme ve çıkarma üzerine kuruludur, ancak erişim sırası ve dolayısıyla kullanım amaçları tamamen farklıdır. Aşağıdaki tablo temel farkları özetler:
| Özellik | Stack (Yığın) | Queue (Kuyruk) | |---|---|---| | Erişim mantığı | LIFO (Son giren ilk çıkar) | FIFO (İlk giren ilk çıkar) | | Ekleme işlemi | push | enqueue | | Çıkarma işlemi | pop | dequeue | | Erişim noktası | Tek uç (üst/top) | İki uç (ön/front, arka/rear) | | Görüntüleme işlemi | peek / top | front / peek | | Hata durumları | Overflow, underflow | Overflow, underflow | | Tipik kullanım amacı | Geri alma, fonksiyon çağrı yığını, parantez eşleştirme | Görev sıralama, yazdırma kuyruğu, mesaj kuyrukları |
Bu tablodaki en kritik satır erişim mantığıdır, çünkü diğer tüm farklar bu tek prensipten doğar. Stack tek bir uçtan (üst) hem ekleme hem çıkarma yaparken, queue iki farklı uç kullanır: ekleme arkadan, çıkarma önden yapılır. Bu yapısal fark, hangi problemde hangisinin kullanılacağını doğrudan belirler; bir sonraki bölümde bunu günlük hayat örnekleriyle netleştireceğiz.
Günlük Hayattan İki Örnek
Stack ve queue kavramlarını gerçek hayattan iki basit örnekle düşünürsek akılda kalması çok daha kolay oluyor.
Tabak yığını, Stack örneği
Mutfakta üst üste dizilmiş tabakları hayal edin. Yeni yıkanan tabağı yığının en üstüne koyarsınız. Birine yemek servis ederken de en üstteki tabağı alırsınız, en alttakini değil. Yani son koyduğunuz tabak, ilk alacağınız tabaktır. Bu tam olarak stack'in mantığı: LIFO (Last In, First Out). Yığının altına inmeden en üsttekine erişemezsiniz, tıpkı bir stack veri yapısında ara elemana doğrudan ulaşamamanız gibi.
Market kuyruğu, Queue örneği
Şimdi markette kasaya sıra bekleyen insanları düşünün. Kuyruğa ilk giren kişi, işini ilk bitirip ilk çıkan kişidir. Sıranın sonuna eklenirsiniz ve önünüzdeki herkes işini bitirdikçe öne geçersiniz. Bu da queue'nun temel prensibi: FIFO (First In, First Out). Adil bir sıralama ister ve giriş sırasının korunmasını beklersiniz.
Bu iki örnek, stack ve queue'nun "hangi eleman önce işlenir" sorusuna verdiği farklı cevabı somutlaştırıyor.
Kod Örnekleri: Yazdırma Kuyruğu ve Geri Alma

Yazdırma kuyruğu (Queue)
Bir yazıcıya birden fazla belge gönderildiğinde, belgeler gönderilme sırasına göre yazdırılmalıdır. Bu senaryo queue ile doğal olarak modellenir:
kuyruk = Queue()
kuyruk.enqueue("Belge_1.pdf")
kuyruk.enqueue("Belge_2.pdf")
kuyruk.enqueue("Belge_3.pdf")
// Yazıcı sırayla işler
while kuyruk.bosDegil():
belge = kuyruk.dequeue() // en önce eklenen çıkar
yazdir(belge)
Sonuç: Belge_1, Belge_2, Belge_3 sırasıyla yazdırılır. Kimse sıra atlamaz.
Geri alma / Undo (Stack)
Bir metin editöründe yaptığınız işlemleri geri almak istediğinizde, en son yaptığınız işlem önce geri alınmalıdır. Bu da stack ile modellenir:
gecmis = Stack()
gecmis.push("Kelime_Yazildi")
gecmis.push("Satir_Silindi")
gecmis.push("Renk_Degistirildi")
// Ctrl+Z basıldığında
son_islem = gecmis.pop() // en son eklenen çıkar
geriAl(son_islem)
Sonuç: Önce "Renk_Degistirildi" geri alınır, sonra "Satir_Silindi", en son "Kelime_Yazildi". Kullanıcının beklediği davranış tam olarak budur; en son yapılan değişikliği ilk geri almak isteriz.
Hangi Durumda Hangisi Kullanılır? Karar Çerçevesi
Stack ile queue arasında seçim yaparken tek bir soru sormanız yeterli: "İşlem sırası, giriş sırasıyla mı yoksa giriş sırasının tersiyle mi eşleşmeli?"
- Eğer en son eklenen elemanın ilk işlenmesi gerekiyorsa (geri alma, tarayıcı geçmişi, fonksiyon çağrı yığını, parantez eşleştirme gibi) stack doğru seçimdir.
- Eğer ilk eklenen elemanın ilk işlenmesi gerekiyorsa (görev sıraları, mesaj kuyrukları, yazdırma sıraları, müşteri hizmetleri sıra sistemleri gibi) queue doğru seçimdir.
Pratik bir karar çerçevesi şöyle özetlenebilir:
- Adalet ve sıra korunması önemliyse → queue.
- En yeni veriye öncelik verme, geçmişi tersten gezme ihtiyacı varsa → stack.
- Sistem, gecikmeye rağmen giriş sırasını korumalıysa (örneğin bir API'ye gelen isteklerin sırayla işlenmesi) → queue.
- Geri izleme (backtracking), derinlemesine arama (DFS) gibi algoritmik ihtiyaçlar varsa → stack.
Kısacası, veri yapısını seçmeden önce problemin "sıra mantığını" tanımlamak, doğru kararı otomatik olarak ortaya çıkarır.
Sık Sorulan Sorular
Stack ve queue bir arada kullanılabilir mi?
Evet, hatta çoğu gerçek sistemde ikisi birlikte çalışır. Örneğin bir web tarayıcısı, geri gitme için stack, arka planda önceden yüklenecek sayfalar için queue kullanabilir. İki yapıyı birleştiren "deque" (double-ended queue) adında bir veri yapısı da var; her iki uçtan ekleme ve çıkarma yapılmasına izin verir.
Hangisi daha hızlıdır?
İkisi de temel işlemlerini (ekleme, çıkarma) O(1) sürede yapar, yani performans farkı yoktur. Seçim, hız meselesi değil, işin mantığına uygunluk meselesidir. Yanlış yapıyı seçmek programı çalıştırmaz ama beklenen sırayı bozar.
Stack taşması (stack overflow) nedir?
Stack'e sürekli eleman eklenip hiç çıkarılmazsa, ayrılan bellek alanı dolar ve program hata verir. Özellikle sonsuz döngüye giren özyinelemeli (recursive) fonksiyonlarda sık görülür.
Queue'da eleman kaybı olur mu?
Kuyruk kapasitesi sınırlıysa ve dolu haldeyken yeni eleman eklenmeye çalışılırsa, o eleman kaybolabilir veya işlem reddedilir. Bu yüzden gerçek sistemlerde kuyruklar genellikle dinamik boyutlandırılır veya doluluk kontrolü yapılır.
Hangisini önce öğrenmeliyim?
İkisi de temel olduğu için sırası önemli değil. Önemli olan, birini öğrenirken diğerini karşılaştırarak ilerlemek; bu da aradaki mantığı daha net görmenizi sağlar.
Stack ve queue, karmaşık görünse de günlük hayattan tanıdık örneklerle kolayca kavranabilecek iki basit kavram. Hangi problemde hangisinin daha uygun olduğunu anladığınızda, kod yazarken de doğal olarak doğru tercihi yapmaya başlarsınız.