Programlamada Stack ve Queue Kavram ve Veri Yapıları

Programlama sırasında her programcının karşılaştığı stack (yığın) ve queue (kuyruk) kavram ve yapılarından bahsedeceğim. PHP ve Python programlama dillerinden örnekler vererek konuyu daha iyi anlamanızı sağlamaya çalışacağım.

Stack Nedir?

Stack (yığın), programlama dillerinde veri yapılarından biridir. LIFO (Last In - First Out) ilk giren son çıkar mantığına dayanan bir veri yapısıdır. İsmi, bir yığın eşyasının üzerine eklenen son öğenin, ilk çıkarılması gerektiği düşüncesinden gelir.

Stack, bir bellek bölgesi üzerinde işlem yapar ve genellikle veri eklemek (push) ve veri çıkarmak (pop) için kullanılır. Veriler, stack'in en üstüne (top) eklenir ve en üstten çıkarılır.

Stack, genellikle çağrı yığını (call stack) olarak da adlandırılan bir sistemde kullanılır. Programlar, fonksiyon çağrıları, yerel değişkenler ve dönüş adresleri gibi verileri çağrı yığını üzerinde saklar. Bir fonksiyon çağrıldığında, çağrı yığınına yeni bir çerçeve (frame) eklenir ve fonksiyonun değişkenleri ve diğer bilgileri bu çerçeveye yerleştirilir. Fonksiyon sonlandığında, çağrı yığınındaki en üstteki çerçeve çıkarılır ve kontrol dönüş adresi olan yerdeki işleme devam edilir.

Stack veri yapısı, rekürsif fonksiyonlarda, derleme işleminde, bellek yönetiminde ve diğer birçok alanda yaygın olarak kullanılır.

// Stack oluştur
$stack = new SplStack();

// Stack'e elemanlar ekleyelim
$stack->push(10);
$stack->push(20);
$stack->push(30);

// Stack'ten elemanları çıkaralım
echo $stack->pop() . "\n"; // 30
echo $stack->pop() . "\n"; // 20
echo $stack->pop() . "\n"; // 10

Yukarıda PHP programlama dili ile yazılmış basit bir stack veri yapısı örneğini görebilirsiniz.

class Stack:
def __init__(self):
self.stack = []

def push(self, item):
self.stack.append(item)

def pop(self):
if not self.isEmpty():
return self.stack.pop()
else:
return None

def isEmpty(self):
return len(self.stack) == 0

def getSize(self):
return len(self.stack)

# Stack oluştur
stack = Stack()

# Stack'e elemanlar ekleyelim
stack.push(10)
stack.push(20)
stack.push(30)

# Stack'ten elemanları çıkaralım
print(stack.pop()) # 30
print(stack.pop()) # 20
print(stack.pop()) # 10

Yukarıda Python programlama dili ile yazılmış basit bir stack veri yapısı örneğini görebilirsiniz.

Queue Nedir?

Queue (kuyruk), veri öğelerini FIFO (First In - First Out) ilk giren ilk çıkar mantığıyla yöneten bir veri yapısıdır. Yani, bir queue'da en önce eklenen eleman en önce çıkarılır. Queue, gerçek dünyadaki sıra veya kuyruk kavramına benzer bir yapıdır.

Queue veri yapısının temel operasyonları şunlardır:

Enqueue (Ekleme): Queue'ya yeni bir eleman ekler. Bu işlem, queue'nun sonuna eleman ekleyerek gerçekleştirilir.

Dequeue (Çıkarma): Queue'dan en üstteki elemanı çıkarır. Bu işlem, queue'nun başındaki elemanı çıkartarak gerçekleştirilir.

Peek (Bakma): Queue'daki en üstteki elemana erişir, ancak elemanı çıkarmaz.

Queue veri yapısı, çeşitli senaryolarda kullanılır. Örneğin, işlem sırası takibi, iş parçacığı yönetimi, yazılım kuyrukları, ağ trafiği yönetimi ve işlemci planlaması gibi durumlarda queue veri yapısı kullanılabilir.

Queue, genellikle diziler veya bağlı listelerle temsil edilir. Dizilerde elemanlar bir sıralı yapıda depolanır ve enqueue ve dequeue işlemleri dizinin uygun konumlarında gerçekleştirilir. Bağlı listelerde ise her eleman, bir sonraki elemanın referansını tutacak şekilde bağlantılı bir yapıda tutulur.

// Queue oluştur
$queue = new SplQueue();

// Elemanları queue'ya ekle
$queue->enqueue(10);
$queue->enqueue(20);
$queue->enqueue(30);

// Queue'dan elemanları çıkar
echo $queue->dequeue() . "\n"; // 10
echo $queue->dequeue() . "\n"; // 20
echo $queue->dequeue() . "\n"; // 30

Yukarıda PHP programlama dili ile yazılmış basit bir queue veri yapısı örneğini görebilirsiniz.

queue = []

# Enqueue (Ekleme)
queue.append(10)
queue.append(20)
queue.append(30)

# Queue'dan elemanları çıkaralım
print(queue.pop(0)) # 10
print(queue.pop(0)) # 20
print(queue.pop(0)) # 30

Yukarıda Python programlama dili ile yazılmış basit bir queue veri yapısı örneğini görebilirsiniz.

Stack vs Queue

Bu tarz içeriklerde bir tür karşılaştırma yapmayı seviyorum. Bu içerikte de Stack ve Queue veri yapıları arasındaki temel farklara değinmek istiyorum.

Sıralama: Stack, veri öğelerini son giren ilk çıkar (Last-In-First-Out - LIFO) mantığıyla yönetirken, queue veri öğelerini ilk giren ilk çıkar (First-In-First-Out - FIFO) mantığıyla yönetir. Yani, stack'te en son eklenen öğe en önce çıkarılırken, queue'da en önce eklenen öğe en önce çıkarılır.

Ekleme ve Çıkarma İşlemleri: Stack'te ekleme işlemi "push" olarak adlandırılırken, çıkarma işlemi "pop" olarak adlandırılır. Queue'da ise ekleme işlemi "enqueue" olarak adlandırılırken, çıkarma işlemi "dequeue" olarak adlandırılır.

Veri Erişimi: Stack'te sadece en üstteki öğe erişilebilirken, diğer öğelere erişim mümkün değildir. Queue'da ise en üstteki öğeyle birlikte diğer öğelere de erişim sağlanabilir.

Kullanım Senaryoları: Stack genellikle geri alma işlemleri, fonksiyon çağrıları, derinlik öncelikli arama gibi senaryolarda kullanılırken, queue ise işlem sırası takibi, iş parçacığı yönetimi, yazılım kuyrukları gibi senaryolarda kullanılır.

Temsil Ediliş Biçimi: Stack genellikle bir dizi (array) veya bağlı liste (linked list) olarak temsil edilirken, queue da dizi veya bağlı liste kullanılarak temsil edilebilir. Ancak, queue'lar için bazı dillerde özel queue sınıfları veya modülleri de mevcuttur.

Bu farklar, stack ve queue veri yapılarını birbirinden ayıran temel özelliklerdir. Kullanım senaryonuza ve ihtiyaçlarınıza bağlı olarak, hangi veri yapısının tercih edileceğine karar verebilirsiniz.