Menu
Coddy logo textTech

Stack (Yığın)

Son güncelleme

Bir stack (yığın), tam olarak tek bir açık ucu olan bir koleksiyondur. Bir değeri tepeye iterek (push) eklersiniz, yine tepeden çekerek (pop) çıkarırsınız; böylece en son giren değer daima ilk çıkan olur. LIFO'nun anlamı budur ve kuralın tamamı da bundan ibarettir: üstündekileri çıkarmadan ortadaki bir değere uzanmanın yolu yoktur. Yukarıdan Oynat'a basın; sütunun her push ile büyümesini, her pop ile aynı uçtan küçülmesini izleyin.

Kısıtlamanın kendisi işin özüdür. Her iki işlem de yalnızca tepeye dokunduğu için, yığın ne kadar yükselirse yükselsin her biri O(1)'dir. Yığınların bilgisayar dünyasında bu kadar çok şeyin altında yatmasının nedeni de bu öngörülebilirliktir: özyinelemeyi çalıştıran çağrı yığını, bir düzenleyicideki geri alma geçmişi, bir ayrıştırıcıdaki parantez eşleştirme ve özyinelemeli bir derinlik öncelikli aramayı döngüye çeviren açık yığın. Çıkarmanın yapıldığı ucu değiştirin, elinizde bunun yerine bir queue olur.

Zaman ve alan karmaşıklığı

Dizi veya bağlı liste tabanlı standart yığın için:

İşlemKarmaşıklıkNotlar
Push (ekleme)O(1)Zaman zaman yeniden boyutlanan dinamik bir dizide amortize edilmiş O(1).
Pop (çıkarma)O(1)Her zaman tepedeki eleman olduğu için kaydırma gerekmez.
Peek (tepeye bakma)O(1)Tepedeki değeri çıkarmadan okur.
AramaO(n)Yığın bunun için değildir: aşağı inmek için değerleri teker teker çıkarmanız gerekir.
AlanO(n)Saklanan her değer için bir yuva.

Adım adım

AdımNe olur
1Yığın boş başlar; tepe hiçbir şeyi göstermez.
2Push, değeri tepe konumuna yazar ve tepeyi bir yukarı taşır.
3Sonraki her push, bir önceki değerin tam üstüne oturur.
4Pop, tepedeki değeri okur ve ardından tepeyi bir aşağı taşır.
5Geri dönen değer daima en son eklenmiş olandır.
6Boş bir yığından çıkarma yapmak hatadır, buna yığın boşalması (stack underflow) denir; bu yüzden gerçek kod önce is_empty() kontrolü yapar.

Çözümlü örnek

3, 7, 5 değerlerini ekleyip ardından yığını boşaltma:

İşlemYığın (alttan üste)Döndürdüğü
push(3)[3]hiçbir şey
push(7)[3, 7]hiçbir şey
push(5)[3, 7, 5]hiçbir şey
pop()[3, 7]5, en yeni değer
pop()[3]7
pop()[]3, en eski değer, en sonda

Stack ne zaman kullanılır

Şu durumlarda kullanınŞu durumlarda kaçının
En son eklenen öğeyi önce geri almanız gerekiyorsa: geri alma, geri butonları, parantez eşleştirmeEn eski öğeye önce ihtiyacınız varsa; bunun için bir queue vardır
Özyinelemeli bir algoritmayı yinelemeli hale getiriyorsanızVerinin ortasında arama yapmanız veya indeksle erişmeniz gerekiyorsa
İfadeler, JSON veya HTML gibi iç içe yapıları ayrıştırıyorsanızBirçok okuyucunun rastgele erişime ihtiyacı varsa; bu durumda bir dizi veya harita daha uygundur
Yeniden dengeleme olmadan garantili O(1) ekleme ve çıkarma istiyorsanızVerinin sıralı tutulması gerekiyorsa; bunu bir heap veya ağaç sağlar

Stack kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Stack uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Stack kodu

Python
1stack = []2
3# Push three values onto the top4for value in [3, 7, 5]:5    stack.append(value)6    print(f"push {value} -> {stack}")7
8# Pop them back off: last in, first out9while stack:10    value = stack.pop()11    print(f"pop  {value} -> {stack}")12
13print("empty:", len(stack) == 0)
Bu kodu Python Playground'da çalıştır

Stack SSS

LIFO ne demek?
Last in, first out, yani son giren ilk çıkar: en son eklenen değer, ilk çıkarılan değerdir. Alışılmış benzetme bir tabak yığınıdır; az önce koyduğunuz tabağı alırsınız, en alttakini değil. Bir queue ise tam tersi kurala, FIFO'ya uyar.
Stack ile queue arasındaki fark nedir?
Yalnızca hangi uçtan çıkardığınız. İkisi de bir uçtan O(1) ile ekler; stack aynı uçtan çıkarır (LIFO), queue diğer uçtan çıkarır (FIFO). Yukarıdaki karmaşıklık tablosu dahil geri kalan her şey aynıdır.
Yığının temel işlemleri nelerdir?
push tepeye bir değer ekler, pop tepedeki değeri çıkarıp döndürür, peek (bazen top) tepedeki değeri çıkarmadan okur ve is_empty geriye bir şey kalıp kalmadığını bildirir. Dördü de O(1)'dir.
Yığın taşması (stack overflow) nedir?
Yer kalmamış bir yığına ekleme yapmaktır. Ünlü örnek çağrı yığınıdır: her fonksiyon çağrısı bir çerçeve ekler, bu yüzden temel durumuna hiç ulaşmayan bir özyineleme, çalışma zamanının yığın sınırına çarpıp program çökene kadar eklemeye devam eder. Bunun aynadaki karşılığı, yani boş bir yığından çıkarma yapmak, yığın boşalmasıdır (stack underflow).
Bir yığın nasıl gerçeklenir?
İki yaygın yol var. Dinamik bir dizi eklemeyi ve çıkarmayı sondan yapar: amortize O(1) ve önbellek dostudur, Python'daki list ile Java'daki ArrayDeque böyle çalışır. Bağlı liste eklemeyi ve çıkarmayı baştan yapar: en kötü durumda O(1) ve yeniden boyutlandırma yoktur, ama eleman başına bir işaretçi tutar. C++'taki std::stack bir adaptördür: varsayılan olarak parçalı bir dizi olan std::deque üzerinde çalışır, isterseniz başka bir kapsayıcı da verebilirsiniz.
Gerçek programlarda yığınlar nerede kullanılır?
Fonksiyon çağrıları ve özyineleme için çağrı yığını, geri alma ve yineleme geçmişi, tarayıcıda geri gezinme, ayrıştırıcılarda ifade değerlendirme ve parantez eşleştirme, bir de özyinelemeli bir derinlik öncelikli aramayı yinelemeli bir döngüye çeviren açık yığın.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA