Veri yapıları giriş rehberi olarak bu yazı, programlamada temel üç yapıyı, dizi (array), yığın (stack) ve kuyruk (queue), somut kod örnekleriyle açıklar. Bu kavramları anlamak, günlük kodlama problemlerini çok daha hızlı çözmenizi sağlar. **Neden veri yapısı öğrenmeli?** Doğru veri yapısını seçmek, kodun hem daha okunabilir hem de daha verimli olmasını sağlar. Yanlış seçim ise gereksiz karmaşıklığa ve yavaşlığa yol açar. **1. Dizi (Array / Liste)** Dizi, elemanların sıralı ve indekslenmiş biçimde tutulduğu yapıdır. Python'da liste (`list`) bu rolü üstlenir. ```python meyveler = ["elma", "armut", "kiraz"] # Erişim, O(1) zaman karmaşıklığı print(meyveler[0]) # elma print(meyveler[-1]) # kiraz (sondan erişim) # Ekleme meyveler.append("çilek") # sona ekle meyveler.insert(1, "muz") # belirli konuma ekle # Çıkarma meyveler.pop() # sondan çıkar meyveler.pop(0) # baştan çıkar, O(n) dikkat! ``` Dizi başından eleman çıkarmak O(n) maliyetlidir çünkü kalan tüm elemanlar kaydırılır. Bunu sık yapıyorsanız kuyruk kullanmayı düşünün. **2. Yığın (Stack)** Yığın, "son giren, ilk çıkar" (LIFO, Last In, First Out) prensibine göre çalışır. Sayfalar arası geri-ileri gitme, geri alma (undo) işlemleri bu yapıyla yönetilir. ```python yigin = [] # Eleman ekleme (push) yigin.append("A") yigin.append("B") yigin.append("C") print(yigin) # ['A', 'B', 'C'] # Eleman çıkarma (pop), her zaman en üstten son = yigin.pop() print(son) # C print(yigin) # ['A', 'B'] # En üstteki elemana bak (peek) print(yigin[-1]) # B ``` Veri yapıları giriş rehberinin bu bölümünde yığın için önemli bir nokta: `pop()` her zaman listenin sonundan (yığının tepesinden) çıkarır. Bu işlem O(1) maliyetlidir. **3. Kuyruk (Queue)** Kuyruk, "ilk giren, ilk çıkar" (FIFO, First In, First Out) prensibine göre çalışır. Yazıcı kuyruğu, müşteri sırası, görev işleyiciler bu yapıyı kullanır. Python'da kuyruk için `collections.deque` kullanın (liste değil; listenin başından çıkarma işlemi pahalıdır): ```python from collections import deque kuyruk = deque() # Kuyruğa ekleme (enqueue) kuyruk.append("1. müşteri") kuyruk.append("2. müşteri") kuyruk.append("3. müşteri") # Kuyruktan çıkarma (dequeue), her zaman en önden ilk = kuyruk.popleft() print(ilk) # 1. müşteri print(kuyruk) # deque(['2. müşteri', '3. müşteri']) ``` `deque.popleft()` O(1) maliyetlidir; bu nedenle kuyruk için `list.pop(0)` yerine `deque` tercih edilmelidir. **Hangi yapıyı ne zaman kullanırsınız?** | Senaryo | Kullanılacak Yapı | |---------|------------------| | Sıralı veri, rastgele erişim | Dizi (list) | | Geri alma (undo), tarayıcı geçmişi | Yığın (stack) | | Sıra yönetimi, görev kuyruğu | Kuyruk (deque) | **Pratik örnek: Parantez kontrolü (yığın kullanımı)** ```python def parantez_dengeli_mi(metin): yigin = [] esler = {")": "(", "]": "[", "}": "{"} for karakter in metin: if karakter in "([{": yigin.append(karakter) elif karakter in ")}]": if not yigin or yigin[-1] != esler[karakter]: return False yigin.pop() return len(yigin) == 0 print(parantez_dengeli_mi("({[]})")) # True print(parantez_dengeli_mi("({[})")) # False ``` Bu örnek, yığının gerçek dünya problemlerini nasıl zarif şekilde çözdüğünü gösterir. **Yaygın hatalar** - Kuyruk için `list.pop(0)` kullanmak: Büyük verilerde performansı ciddi şekilde düşürür. - Yığın ve kuyruk mantığını karıştırmak: Hangi yapının LIFO, hangisinin FIFO olduğunu ezberlemek yerine use-case'i düşünün.