C++ stack, queue ve priority_queue Kullanımı
C++ std::stack, std::queue ve std::priority_queue kullanımını öğrenin. Temel veri yapıları, öncelikli kuyruklar ve pratik örnekler keşfedin.
C++ Standard Library, stack, queue ve priority_queue ile farklı veri yapılarının davranışlarını kolay şekilde kullanmamızı sağlar. Bu yapılar sırasıyla LIFO (Last-In First-Out), FIFO (First-In First-Out) ve öncelik tabanlı kuyruk mantığıyla çalışır. Bu makalede her bir yapının çalışma prensibi, kullanım alanları ve örnek kodlar yer almaktadır.
1) stack Nedir? (LIFO Yapısı)
std::stack, son giren elemanın ilk çıktığı LIFO (Last-In First-Out) modeline göre çalışır. Bir dizinin veya listenin tam tersine, sadece tepe (top) üzerinden işlem yapılabilir.
- push() → üste eleman ekler
- pop() → üstteki elemanı çıkarır
- top() → üstteki elemanı döndürür
- empty() → yığının boş olup olmadığını döndürür
- size() → eleman sayısı
#include <stack>
#include <iostream>
using namespace std;
int main() {
stack<int> st;
st.push(10);
st.push(20);
st.push(30);
cout << "Top: " << st.top() << endl; // 30
st.pop(); // 30 çıkar
cout << "Top: " << st.top() << endl; // 20
}
Kullanım Alanları: geri alma işlemleri, derleyici parantez kontrolü, fonksiyon çağrı yığınları.
2) queue Nedir? (FIFO Yapısı)
std::queue, ilk giren elemanın ilk çıktığı FIFO modeline göre çalışır.
- push() → sona eleman ekler
- front() → ilk elemanı döndürür
- back() → son elemanı döndürür
- pop() → ilk elemanı çıkarır
- empty(), size()
#include <queue>
#include <iostream>
using namespace std;
int main() {
queue<string> q;
q.push("Ali");
q.push("Ayşe");
q.push("Mehmet");
cout << "Front: " << q.front() << endl; // Ali
cout << "Back: " << q.back() << endl; // Mehmet
q.pop(); // Ali çıkar
cout << "Front: " << q.front() << endl; // Ayşe
}
Kullanım Alanları: işlem sıraları, görev yönetimi, mesajlaşma sistemleri.
3) priority_queue Nedir?
std::priority_queue, elemanları büyüklüğe göre otomatik olarak sıralayan bir öncelik kuyruğudur. Varsayılan olarak en büyük eleman en önde bulunur (max-heap).
- push() → kuyruk içine ekler
- top() → en öncelikli (en büyük veya en küçük) eleman
- pop() → en öncelikli elemanı çıkarır
- size(), empty()
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<int> pq;
pq.push(50);
pq.push(10);
pq.push(80);
pq.push(20);
cout << "Top: " << pq.top() << endl; // 80
pq.pop(); // 80 çıkar
cout << "Top: " << pq.top() << endl; // 50
}
Kullanım Alanları: en kısa yol algoritmaları (Dijkstra), işlem önceliklendirme, sıralama işlemleri.
4) priority_queue ile Min-Heap Kullanımı
Varsayılan priority_queue bir max-heap oluşturur,
ancak min-heap yapmak için greater<> kullanılır.
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int>> minpq;
minpq.push(40);
minpq.push(10);
minpq.push(30);
cout << "Top: " << minpq.top() << endl; // 10
}
5) Uygulamalı Örnekler
a) stack ile Parantez Dengesi Kontrolü
#include <stack>
#include <string>
#include <iostream>
using namespace std;
bool check(string s) {
stack<char> st;
for (char c : s) {
if (c == '(') st.push(c);
else if (c == ')') {
if (st.empty()) return false;
st.pop();
}
}
return st.empty();
}
int main() {
cout << check("((a+b)*(c-d))"); // 1
}
b) queue ile Banka Sıra Simülasyonu
#include <queue>
#include <iostream>
using namespace std;
int main() {
queue<string> customers;
customers.push("Ali");
customers.push("Ayşe");
customers.push("Selim");
while (!customers.empty()) {
cout << "Hizmet verilen: " << customers.front() << endl;
customers.pop();
}
}
c) priority_queue ile Görev Önceliklendirme
#include <queue>
#include <iostream>
using namespace std;
int main() {
priority_queue<pair<int,string>> tasks;
tasks.push({3, "Düşük öncelik"});
tasks.push({10, "Yüksek öncelik"});
tasks.push({5, "Orta seviye"});
while (!tasks.empty()) {
cout << "Görev: " << tasks.top().second << endl;
tasks.pop();
}
}
6) Hangi Yapı Ne Zaman Kullanılır?
- stack: geri alma, parantez eşleme, fonksiyon çağrı yığını
- queue: işlem sırası, görev akışı, mesaj kuyruğu
- priority_queue: öncelikli görevler, algoritmalar, sıralama
Her yapı amacına göre yüksek performans sağlar. Doğru veri yapısını seçmek uygulamaların hızını ve doğruluğunu artırır.
7) TL;DR
- stack: LIFO, tek uçtan işlem, en son eklenen çıkar.
- queue: FIFO, sırayla çıkar, ilk eklenen çıkar.
- priority_queue: öncelik tabanlı; varsayılan max-heap.
- Min-heap kullanmak için:
greater<>tipi verilir. - Tüm örnekler Visual Studio 2022 ve GCC ile uyumludur.
İlişkili Makaleler
C++ list ve deque ile Sıralı Veri Yapıları
C++ std::list ve std::deque kullanımını öğrenin. Sıralı veri yapıları, performans farkları ve kullanım senaryoları örneklerle anlatılıyor.
C++ Standard Library'ye Genel Bakış
C++ Standard Library'yi öğrenin. STL bileşenleri, konteynerler, algoritmalar ve modern C++ geliştirmede temel kütüphaneleri keşfedin.
C++ vector Kullanımı ve Özellikleri
C++ std::vector kullanımını öğrenin. Dinamik diziler, eleman ekleme, silme ve erişim işlemlerini pratik örneklerle keşfedin.