Yığınla C++ Örnekle STL

⚡ Akıllı Özet

Yığınla C++ STL, tek bir uçtan başlayıp tek bir sarmalayıcıdan başlayarak eleman ekleyen ve çıkaran bir LIFO kapsayıcı adaptörü uygular.ping Sıralı verileri yönetmek için kullanılan, deque, vector veya list gibi temel bir sıralı yapı.

  • 🔘 LIFO prensibi: std::stack, Son Giren İlk Çıkar (LIFO) sırasını izler; bu nedenle en son eklenen öğe her zaman ilk kaldırılan öğedir.
  • ???? Konteyner adaptörü: Bir yığın, mevcut bir sıralı kapsayıcıyı sarar ve kapsayıcı türü belirtilmediğinde varsayılan olarak çift uçlu kuyruğa (deque) döner.
  • Temel operasyonlar: "Push", "pop" ve "top" fonksiyonları sırasıyla bir öğeyi ekleme, üstteki öğeyi çıkarma ve üstteki öğeyi okuma işlevlerini yerine getirir.
  • 🔍 Devlet kontrolleri: `empty` ve `size` fonksiyonları, yığının eleman içerip içermediğini ve şu anda kaç eleman sakladığını bildirir.
  • 🔁 Ekstra fonksiyonlar: `emplace` ve `swap` fonksiyonları, bir öğeyi yerinde oluşturur ve iki yığının içeriğini değiştirir.
  • 🤖 Yapay zeka yardımı: GitHub Copilot gibi yapay zeka kodlama asistanları, kısa bir yorumdan yığın itme, çekme ve gezinme için gerekli şablon kodları oluşturur.

Yığınla C++ STL

std::stack nedir?

Yığın, LIFO (Son Giren İlk Çıkar) tekniğine dayalı olarak çalışan bir veri yapısıdır. std::stack, elemanların yalnızca bir uçtan eklenmesine ve çıkarılmasına izin verir.

`std::stack` sınıfı bir konteyner adaptörüdür. Konteyner nesneleri benzer veri türündeki verileri tutar. Çeşitli sıralı konteynerlerden bir yığın oluşturabilirsiniz. Herhangi bir konteyner sağlanmazsa, varsayılan olarak `deque` konteyneri kullanılır. Konteyner adaptörleri yineleyicileri desteklemez, bu nedenle veri manipülasyonu için kullanılamazlar.

Yığın Söz Dizimi

Bir yığın oluşturmak için şunu eklemeliyiz: kodumuzda başlık dosyası. Daha sonra std::stack'ı tanımlamak için bu sözdizimini kullanırız:

template <class Type, class Container = deque<Type> > class stack;
  • Menşei – std::stack'ta bulunan öğenin Türüdür. Herhangi bir geçerli olabilir C++ yazın ve hatta kullanıcı tanımlı bir tür.
  • Konteyner – Temeldeki konteyner nesnesinin Türüdür.

Üye Türleri

Yığın üye türleri şunlardır:

  • değer_türü– İlk şablon parametresi olan T, öğe türlerini belirtir.
  • konteyner_tipi– İkinci şablon parametresi olan Container, temel kapsayıcı türünü belirtir.
  • Beden Çeşidi– İşaretsiz tam sayı tipi.

OperaStack'teki işlemler

A C++ stack aşağıdaki temel işlemleri destekler:

  • itmek – Yığına bir öğe ekler/iter.
  • pop – Yığından bir öğeyi kaldırır/çıkarır.
  • gözetleme – Yığındaki en üstteki öğeyi kaldırmadan döndürür.
  • dolu – Bir yığının dolu olup olmadığını kontrol eder.
  • boş – Bir yığının boş olup olmadığını kontrol eder.

Yığın Uygulaması

Aşağıdaki adımlar, öğeler yığına eklendikçe ve ardından yığından çıkarıldıkça yığının üst kısmının nasıl kaydığını göstermektedir:

Adım 1) Başlangıçta boş bir yığınımız var. Boş yığının en üstündeki eleman -1 olarak ayarlanır.

Adım 2) Ardından, 5 elemanını yığına ekledik. Yığının en üstündeki eleman 5'i gösterecektir.

3. Adım) Ardından, 50 numaralı elemanı yığına ekledik. Yığının üst kısmı kayarak 50 numaralı elemanı gösterir hale geldi.

Adım 4) Ardından, yığının en üstündeki elemanı kaldırarak bir pop işlemi gerçekleştirdik. 50 numaralı eleman yığından çıkarıldı. Yığının en üstündeki eleman artık 5 numaralı elemanı gösteriyor.

Yığın Uygulaması

itme() ve pop()

`stack::push()` fonksiyonu, yığının en üstüne yeni bir öğe ekler. Ekleme işleminden sonra yığın boyutu 1 artırılır. Fonksiyon şu sözdizimini kullanır:

stack.push(value)

Değer, yığına eklenecek öğedir.

`stack::pop()` fonksiyonu, yığının en üstündeki öğeyi kaldırır. Bu, yığının en yeni öğesidir. Kaldırma işleminden sonra yığın boyutu 1 azalır. İşte fonksiyonun sözdizimi:

stack.pop()

Fonksiyon hiçbir parametre almaz.

Örnek 1:

#include <iostream> 
#include <stack> 
using namespace std;
int main() {
	stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	
         st.pop();
	st.pop();

	while (!st.empty()) {
		cout << ' ' << st.top();
		st.pop();
	}
}

Çıktı:

itme() ve pop()

İşte kodun ekran görüntüsü:

itme() ve pop()

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için yığın başlık dosyasını kodumuza ekleyin.
  3. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  4. Main() işlevini çağırın. Bu fonksiyonun içerisine program mantığı eklenmelidir.
  5. Tamsayı değerlerini depolamak için bir yığın st oluşturun.
  6. Yığına 10 değerini eklemek için push() işlevini kullanın.
  7. Yığına 20 değerini eklemek için push() işlevini kullanın.
  8. Yığına 30 değerini eklemek için push() işlevini kullanın.
  9. Yığına 40 değerini eklemek için push() işlevini kullanın.
  10. Üstteki öğeyi (40) yığından kaldırmak için pop() işlevini kullanın. Üst öğe artık 30 olur.
  11. Üstteki öğeyi (30) yığından kaldırmak için pop() işlevini kullanın. Üst öğe artık 20 olur.
  12. Yığının boş OLMADIĞINI kontrol etmek için while döngüsünü ve empty() işlevini kullanın. ! NOT operatörüdür.
  13. Yığındaki mevcut içeriklerin konsolda yazdırılması.
  14. Yığındaki pop() işlevini çağırın.
  15. While döngüsünün gövdesinin sonu.
  16. main() işlev gövdesinin sonu.

boş(), boyut(), üst()

Yığınların, yığınla ve değerleriyle oynamak için kullanabileceğiniz yerleşik işlevleri vardır. Bunlar şunları içerir:

  • boş()– Yığının boş olup olmadığını kontrol eder.
  • boyut()– yığın boyutunu, yani yığındaki eleman sayısını döndürür.
  • üst()– Yığının en üstündeki öğeye erişir.

Örnek 2:

#include <iostream> 
#include <stack>  
using namespace std;
void createStack(stack <int> mystack)
{
	stack <int> ms = mystack;
	while (!ms.empty())
	{
		cout << '\t' << ms.top();
		ms.pop();
	}
	cout << '\n';
}
int main()
{
	stack <int> st;
	st.push(32);
	st.push(21);
	st.push(39);
	st.push(89);
	st.push(25);

	cout << "The stack st is: ";
	createStack(st);
	cout << "\n st.size() : " << st.size();
	cout << "\n st.top() : " << st.top();
	cout << "\n st.pop() : ";
	st.pop();
	createStack(st);
	return 0;
}

Çıktı:

boş(), boyut(), üst()

İşte kodun ekran görüntüsü:

boş(), boyut(), üst()

Code Açıklama:

  1. Fonksiyonlarını kullanabilmek için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanabilmek için yığın başlık dosyasını kodumuza ekleyin.
  3. Sınıflarını çağırmadan kullanabilmek için programımıza std ad alanını ekleyin.
  4. Yığın mystack'ı oluşturmak için kullanabileceğimiz createStack işlevini oluşturun. Yığın bir dizi tamsayıyı tutacaktır.
  5. createStack işlevinin gövdesinin başlangıcı.
  6. Mystack veri tipinin bir örneğini oluşturun ve ona ms adını verin.
  7. Yığının boş olup olmadığını kontrol etmek için while döngüsünü ve empty() işlevini kullanın.
  8. While döngüsünün gövdesinin başlangıcı.
  9. Yığının en üstünde depolanan top() işlevini kullanın. \t karakteri yeni bir sekme oluşturacaktır.
  10. Yığının en üstündeki öğeyi silmek için pop() işlevini kullanın.
  11. While döngüsünün gövdesinin sonu.
  12. Konsola boş bir satır yazdırın.
  13. createStack işlevinin gövdesinin sonu.
  14. main() fonksiyonunu çağırın. Program mantığı main() fonksiyonunun gövdesine eklenmelidir.
  15. main() fonksiyonunun gövdesinin başlangıcı.
  16. Bir yığın nesnesi st oluşturun.
  17. 32 numaralı öğeyi yığına eklemek için push() işlevini kullanın.
  18. 21 numaralı öğeyi yığına eklemek için push() işlevini kullanın.
  19. 39 numaralı öğeyi yığına eklemek için push() işlevini kullanın.
  20. 89 numaralı öğeyi yığına eklemek için push() işlevini kullanın.
  21. 25 numaralı öğeyi yığına eklemek için push() işlevini kullanın.
  22. Konsola bir miktar metin yazdırın.
  23. Yukarıdaki ekleme işlemlerini yığına yürütmek için createStack işlevini çağırın.
  24. Konsoldaki yığının boyutunu diğer metinlerin yanında yazdırın.
  25. Öğeyi konsoldaki yığının en üstüne yazdırın.
  26. Konsola bir miktar metin yazdırın.
  27. Yığının en üstündeki öğeyi silin. Daha sonra yığında kalan elemanları döndürecektir.
  28. Yukarıdaki işlemleri yürütmek için createStack işlevini çağırın.
  29. Program başarılı bir şekilde tamamlandıktan sonra değeri döndürmelidir.
  30. main() fonksiyonunun gövdesinin sonu.

emplace() ve swap()

Bunlar diğer yerleşik yığın işlevleridir:

  • yerleştirmek()– Ardından yığının en üstüne yeni bir öğe ekler.
  • takas()– Yığın içeriğini başka bir yığının içeriğiyle değiştirir.

Örnek 3:

#include <iostream>    
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st1;
	stack<int> st2;

	st1.emplace(12);
	st1.emplace(19);

	st2.emplace(20);
	st2.emplace(23);

	st1.swap(st2);

	cout << "st1 = ";
	while (!st1.empty()) {
		cout << st1.top() << " ";
		st1.pop();
	}

	cout << endl << "st2 = ";
	while (!st2.empty()) {
		cout << st2.top() << " ";
		st2.pop();
	}
}

Çıktı:

emplace() ve swap()

İşte kodun ekran görüntüsü:

emplace() ve swap()

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için yığın başlık dosyasını kodumuza ekleyin.
  3. İşlevlerini kullanmak için cstdlib başlık dosyasını kodumuza ekleyin.
  4. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  5. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenecektir.
  6. Tamsayı değerlerini depolamak için st1 adında bir yığın bildirin.
  7. Tamsayı değerlerini depolamak için st2 adında bir yığın bildirin.
  8. 12 tamsayısını st1 adlı yığına eklemek için emplace() işlevini kullanın.
  9. 19 tamsayısını st1 adlı yığına eklemek için emplace() işlevini kullanın.
  10. 20 tamsayısını st2 adlı yığına eklemek için emplace() işlevini kullanın.
  11. 23 tamsayısını st2 adlı yığına eklemek için emplace() işlevini kullanın.
  12. İki yığının (st1 ve st2) içeriğini değiştirmek için swap() işlevini kullanın. St1 yığınının içeriği st2 yığınına taşınmalıdır. St2 yığınının içeriği st1 yığınına taşınmalıdır.
  13. Konsola bir miktar metin yazdırın.
  14. ST1 yığınının boş olup olmadığını kontrol etmek için while ifadesini ve empty() işlevini kullanın.
  15. St1 yığınının içeriğini konsola yazdırın. " ", yığın öğelerini konsolda yazdırırken arasına boşluk ekler.
  16. Üstteki öğeyi kaldırmak için st1 yığınında pop() işlevini yürütün.
  17. while ifadesinin gövdesinin sonu.
  18. Konsola bir miktar metin yazdırın. Sonu bir C++ bitiş çizgisi için anahtar kelime. Yazdırmaya oradan başlamak için fare imlecini bir sonraki satıra taşır.
  19. ST2 yığınının boş olup olmadığını kontrol etmek için while ifadesini ve empty() işlevini kullanın.
  20. St2 yığınının içeriğini konsola yazdırın. " ", yığın öğelerini konsolda yazdırırken arasına boşluk ekler.
  21. Üstteki öğeyi kaldırmak için st2 yığınında pop() işlevini yürütün.
  22. while ifadesinin gövdesinin sonu.
  23. Main() işlevinin gövdesinin sonu.

STL'de yığın

STL (Standart Şablon Kitaplığı), ortak özellikler sağlayan şablon sınıflarıyla birlikte gelir. C++ veri yapıları. Bu nedenle STL'de bir yığın da uygulanabilir. Bu kütüphaneyi kodumuza dahil ediyoruz ve onu bir yığın tanımlamak için kullanıyoruz.

stack<T> st; 

Yukarıdaki sözdizimi, T veri türündeki elemanlara st yığınını bildirir.

Örnek 4:

#include <iostream>      
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
	stack<int> st;
	st.push(12);
	st.push(19);
	st.push(20);
	cout << st.top();   
	cout << st.size();  
}

Çıktı:

STL'de yığın

İşte kodun ekran görüntüsü:

STL'de yığın

Code Açıklama:

  1. İşlevlerini kullanmak için iostream başlık dosyasını kodumuza ekleyin.
  2. İşlevlerini kullanmak için yığın başlık dosyasını kodumuza ekleyin.
  3. İşlevlerini kullanmak için cstdlib başlık dosyasını kodumuza ekleyin.
  4. Sınıflarını çağırmadan kullanmak için std ad alanını kodumuza ekleyin.
  5. main() fonksiyonunu çağırın. Program mantığı bu fonksiyonun gövdesine eklenmelidir.
  6. Tamsayı verilerini depolamak için bir yığın st bildirin.
  7. 12. elemanı yığına ekleyin.
  8. 19. elemanı yığına ekleyin.
  9. 20. elemanı yığına ekleyin.
  10. Öğeyi konsoldaki yığının en üstüne yazdırın.
  11. Konsoldaki yığının boyutunu yazdırın.
  12. main() fonksiyonunun gövdesinin sonu.

SSS

Bir yığın (stack) son giren ilk çıkar (LIFO) sırasına göre çalışır, bu nedenle en yeni öğeyi önce kaldırır. Bir kuyruk (queue) ise ilk giren ilk çıkar (FIFO) sırasına göre çalışır ve en eski öğeyi önce kaldırır. Her biri farklı işlem ihtiyaçlarına uygundur.

Evet. std::stack, ikinci şablon argümanı olarak herhangi bir sıralı kapsayıcıyı kabul eder, örneğin std::stack. Varsayılan çift uçlu kuyruk çoğu duruma uygundur, ancak yığın öngörülebilir şekilde büyüdüğünde vektör bellek yerelliğini iyileştirebilir.

Hem push hem de pop işlemleri sabit O(1) sürede çalışır çünkü yığın yalnızca en üstteki elemana dokunur. Altta yatan çift uçlu kuyruk, mevcut elemanları kaydırmadan eleman ekler, bu nedenle performans yığın boyutundan bağımsız olarak tahmin edilebilir kalır.

`std::stack` hiçbir yineleyici sunmaz, bu nedenle aralık tabanlı bir döngü derlenmeyecektir. Her değeri okumak için yığını kopyalayın ve kopya üzerinde tekrar tekrar `top()` ve `pop()` fonksiyonlarını çağırın veya dolaşma gerektiğinde bir çift uçlu kuyruk (deque) seçin.

`pop()` fonksiyonu, istisna güvenliği için erişim ve silme işlemlerini birbirinden ayırmak amacıyla, tasarım gereği `void` döndürür. Kopyalama işlemi hata verirse, okuma ve silme işlemleri tek adımda veri kaybına yol açabilir; bu nedenle önce `top()`, sonra `pop()` fonksiyonunu çağırırsınız.

Hayır. std::stack yerleşik bir senkronizasyon sunmaz, bu nedenle birden fazla iş parçacığından gelen eş zamanlı push ve pop çağrıları veri yarışına neden olur. İş parçacıkları arasında tek bir yığın kullanmadan önce paylaşılan erişimi bir mutex veya başka bir kilitleme mekanizmasıyla koruyun.

Evet. Yapay zekâ kodlama asistanları bir yorumu veya fonksiyon adını okuyarak std::stack bildirimleri, push ve pop döngüleri ve gezinme mantığı üretir. RevOluşturulan sınır kontrollerini incelemek, örneğin pop() işleminden önce empty() testlerini yapmak, güvenli programlar için önemini korumaktadır.

Evet. GitHub Yardımcı Pilotu Siz yazarken push, pop, top ve empty() fonksiyonlarını tamamlar ve konteyner seçenekleri önerir. 2026 yılında piyasaya sürülecek. C++ Kod zekası, sembol farkındalığı ekleyerek çoklu dosya yığın önerilerinin tutarlı kalmasını sağlar.

Bu yazıyı şu şekilde özetleyin: