stack data structure c with illustration
bir apk dosyası nasıl açılır
C ++ 'da Yığın Hakkında Bilmeniz Gereken Her Şey.
Yığın, öğeleri doğrusal bir şekilde depolamak için kullanılan temel bir veri yapısıdır.
Yığın izler LIFO (son giren, ilk çıkar) işlemlerin gerçekleştirildiği sıra veya yaklaşım. Bu, yığına en son eklenen öğenin yığından kaldırılacak ilk öğe olacağı anlamına gelir.
=> Tüm C ++ Eğitim Serisini Herkes İçin Görmek İçin Burayı Ziyaret Edin.
Ne öğreneceksin:
C ++ 'da Yığın
Yığın, gerçek hayattaki yığına veya üst üste yığdığımız bir yığın nesneye benzer.
Aşağıda, Stack'in resimli bir temsilidir.
Yukarıda gösterildiği gibi, üst üste istiflenmiş bir plaka yığını vardır. Başka bir öğe eklemek istersek, yukarıdaki şekilde (sol taraf) gösterildiği gibi yığının en üstüne ekleriz. Yığına bir öğe ekleme işlemine ' it ”.
Sağ tarafta zıt bir işlem gösterdik, yani yığından bir öğeyi kaldırıyoruz. Bu aynı zamanda aynı uçtan yani yığının tepesinden yapılır. Bu işleme ' Pop ”.
Yukarıdaki şekilde görüldüğü gibi push ve pop'un aynı uçtan yapıldığını görüyoruz. Bu, yığının LIFO sırasını takip etmesini sağlar. Öğelerin yığına itildiği veya yığından çıktığı konuma veya sona ' Yığının tepesi ”.
Başlangıçta, yığında hiç öğe olmadığında, yığının üstü -1 olarak ayarlanır. Yığına bir öğe eklediğimizde, yığının tepesi, öğenin eklendiğini belirtecek şekilde 1 artar. Bunun aksine, bir öğe yığından çıktığında yığının tepesi 1 azalır.
Daha sonra, yığını uygularken ihtiyaç duyacağımız yığın veri yapısının bazı temel işlemlerini göreceğiz.
Temel işlemler
Aşağıda, yığın tarafından desteklenen temel işlemler verilmiştir.
- it - Yığına bir öğe ekler veya bir öğeyi iter.
- pop - Yığından bir öğeyi kaldırır veya çıkarır.
- dikizlemek - Yığının en üstteki öğesini alır ancak kaldırmaz.
- dolu - Yığının dolu olup olmadığını test eder.
- boş - Yığının boş olup olmadığını test eder.
İllüstrasyon
Yukarıdaki çizim, yığın üzerinde gerçekleştirilen işlemlerin sırasını gösterir. Başlangıçta yığın boştur. Boş bir yığın için, yığının üstü -1 olarak ayarlanır.
Ardından, element 10'u yığının içine itiyoruz. Yığının tepesinin şimdi element 10'u gösterdiğini görüyoruz.
Daha sonra, eleman 20 ile başka bir itme işlemi gerçekleştiriyoruz, bunun sonucunda yığının tepesi şimdi 20'yi gösteriyor. Bu durum üçüncü rakamdır.
Şimdi son şekilde bir pop () işlemi gerçekleştiriyoruz. Pop işleminin bir sonucu olarak, yığının tepesine işaret eden eleman yığından kaldırılır. Dolayısıyla şekilde, 20 öğesinin yığından çıkarıldığını görüyoruz. Böylece yığının tepesi şimdi 10'u gösteriyor.
Bu şekilde yığın tarafından kullanılan LIFO yaklaşımını kolayca çıkarabiliriz.
Uygulama
# 1) Dizileri Kullanma
Diziler kullanılarak yığının C ++ uygulaması aşağıdadır:
#include using namespace std; #define MAX 1000 //max size for stack class Stack { int top; public: int myStack(MAX); //stack array Stack() { top = -1; } bool push(int x); int pop(); bool isEmpty(); }; //pushes element on to the stack bool Stack::push(int item) { if (top >= (MAX-1)) { cout << 'Stack Overflow!!!'; return false; } else { myStack(++top) = item; cout< Çıktı:
Yığın İtme
iki
4
6
Yığın Pop:
6
4
iki
Çıktıda, öğelerin bir sırayla yığına itildiğini ve ters sırada yığından çıktığını görebiliriz. Bu, yığın için LIFO (Son giren, İlk çıkar) yaklaşımını sergiler.
Yığının yukarıdaki dizi uygulaması için, hiçbir işaretçi olmadığından bunun uygulanmasının çok kolay olduğu sonucuna varabiliriz. Ancak aynı zamanda, yığının boyutu sabittir ve yığın dinamik olarak büyüyemez veya küçülemez.
Daha sonra, Java programlama dilinde dizileri kullanarak yığını uygulayacağız.
class Stack { static final int MAX = 1000; // Maximum Stack size int top; int myStack() = new int(MAX); boolean isEmpty() { return (top = (MAX-1)) { System.out.println('Stack Overflow'); return false; } else { myStack(++top) = item; System.out.println(item); return true; } } int pop() { if (top <0) { System.out.println('Stack Underflow'); return 0; } else { int item = myStack(top--); return item; } } } //Main class code class Main { public static void main(String args()) { Stack stack = new Stack(); System.out.println('Stack Push:'); stack.push(1); stack.push(3); stack.push(5); System.out.println('Stack Pop:'); while(!stack.isEmpty()) { System.out.println(stack.pop()); } } }
Çıktı:
Yığın İtme:
bir
3
5
Yığın Pop:
5
3
bir
Uygulama mantığı, C ++ uygulamasındaki ile aynıdır. Çıktı, LIFO'nun öğeleri yığına / yığından içeri / dışarı itme tekniğini gösterir.
Daha önce de belirtildiği gibi, dizileri kullanan yığın uygulaması en basit uygulamadır, ancak yığını dinamik olarak büyütemediğimiz veya küçültemediğimiz için statik yapıdadır.
# 2) Bağlantılı Liste Kullanma
Daha sonra, hem C ++ hem de Java'da bağlantılı bir liste kullanarak yığın işlemlerini gerçekleştiriyoruz. İlk olarak, C ++ uygulamasını göstereceğiz.
#include using namespace std; // class to represent a stack node class StackNode { public: int data; StackNode* next; }; StackNode* newNode(int data) { StackNode* stackNode = new StackNode(); stackNode->data = data; stackNode->next = NULL; return stackNode; } int isEmpty(StackNode *root) { return !root; } void push(StackNode** root, int new_data){ StackNode* stackNode = newNode(new_data); stackNode->next = *root; *root = stackNode; cout<data; free(temp); return popped; } int peek(StackNode* root) { if (isEmpty(root)) return -1; return root->data; } int main() { StackNode* root = NULL; cout<<'Stack Push:'< Çıktı:
Yığın İtme:
100
200
300
Üst öğe 300
Yığın Pop:
300
200
100
Üst öğe -1'dir
Ardından, bağlantılı bir liste kullanarak yığının Java uygulamasını sunuyoruz.
class LinkedListStack { StackNode root; static class StackNode { int data; StackNode next; StackNode(int data) { this.data = data; } } public boolean isEmpty() { if (root == null) { return true; } else return false; } public void push(int new_data) { StackNode newNode = new StackNode(new_data); if (root == null) { root = newNode; } else { StackNode temp = root; root = newNode; newNode.next = temp; } System.out.println(new_data); } public int pop() { int popped = Integer.MIN_VALUE; if (root == null) { System.out.println('Stack is Empty'); } else { popped = root.data; root = root.next; } return popped; } public int peek() { if (root == null) { System.out.println('Stack is empty'); return Integer.MIN_VALUE; } else { return root.data; } } } class Main{ public static void main(String() args) { LinkedListStack stack = new LinkedListStack(); System.out.println('Stack Push:'); stack.push(100); stack.push(200); stack.push(300); System.out.println('Top element is ' + stack.peek()); System.out.println('Stack Pop:'); while(!stack.isEmpty()){ System.out.println(stack.pop()); } System.out.println('Top element is ' + stack.peek()); } }
Çıktı:
Yığın İtme:
100
200
300
Üst öğe 300
Yığın Pop:
300
200
100
Yığın boş
Üst öğe -2147483648'dir
Bağlantılı listeleri kullanan bir yığın için C ++ ve Java uygulamalarını gördük. Her yığın girişini bağlantılı listenin bir düğümü olarak temsil ederiz. Bu uygulamanın en önemli avantajı dinamik olmasıdır. Bu, istif boyutunu ihtiyacımıza göre büyütebileceğimiz veya küçültebileceğimiz anlamına gelir.
Bu, boyutu önceden bildirmemiz gereken ve onu dinamik olarak değiştiremediğimiz dizileri kullanan yığın uygulamasından farklıdır.
Bu uygulamanın dezavantajı, her yerde işaretçiler kullandığımız için, dizi uygulamasına kıyasla biraz fazla yer kaplamasıdır.
Stack Uygulamaları
Yığın veri yapısının bazı uygulamalarını tartışalım. Yığın veri yapısı, temel olarak basitliği ve uygulama kolaylığı nedeniyle yazılım programlamadaki bir dizi uygulamada kullanılır.
Yığının bazı uygulamalarını aşağıda kısaca açıklayacağız:
# 1) Postfix İfadelerine Infix
Herhangi bir genel Aritmetik ifade formdadır işlenen1 OP işlenen 2 .
OP operatörünün konumuna bağlı olarak, aşağıdaki ifade türlerine sahibiz:
- Infix - İnfix ifadesinin genel biçimi ' işlenen1 OP işlenen 2 ”. Bu, ifadenin temel biçimidir ve matematikte her zaman kullanırız.
- Önek - Bir operatör, işlenenlerin önüne yerleştirildiğinde, bu bir önek ifadesidir. İnfix ifadesinin genel biçimi ' OP işlenen1 işlenen2 ”.
- Postfix - Sonek ifadelerinde, önce işlenenler ve ardından operatör yazılır. 'Operand1 operand2 OP' formuna sahiptir.
'A + b * c' ifadesini düşünün ' . Derleyici ifadeyi soldan sağa veya sağdan sola tarar. Operatör önceliğine ve ilişkiselliğine dikkat ederek, önce b * c ifadesini değerlendirmek için ifadeyi tarayacaktır. Daha sonra, b * c'nin sonucunu a'ya eklemek için ifadeyi tekrar taraması gerekecektir.
İfadeler gittikçe karmaşıklaştıkça, ifadeyi tekrar tekrar tarayan bu tür bir yaklaşım verimsiz hale gelir.
Bu verimsizliğin üstesinden gelmek için, ifadeyi bir yığın veri yapısı kullanılarak kolayca değerlendirilebilecek şekilde postfix veya öneke dönüştürüyoruz.
# 2) İfade Ayrıştırma / Değerlendirme
Stack kullanarak gerçek ifade değerlendirmesini de yapabiliriz. Bunda, ifade soldan sağa taranır ve işlenenler yığına itilir.
yazılım testi için bir test planı nasıl oluşturulur
Bir operatörle her karşılaşıldığında, işlenenler çıkar ve işlem gerçekleştirilir. İşlemin sonucu tekrar yığına itilir. Bu şekilde ifade, yığın kullanılarak değerlendirilir ve ifadenin nihai sonucu genellikle yığının şu anki en üstündedir.
# 3) Ağaç Geçişleri
Ağaç veri yapısı, her bir düğümü birçok şekilde ziyaret etmek için ve sahip olduğumuz kök düğümün ne zaman ziyaret edildiğine bağlı olarak gezilebilir.
- inOrder geçişi
- Ön Sipariş Geçişi
- postOrder geçişi
Ağacı verimli bir şekilde geçmek için, geçiş sırasını korumak amacıyla yığın üzerindeki ara düğümleri itmek için yığın veri yapısından yararlanıyoruz.
# 4) Algoritmaları Sıralama
Hızlı sıralama gibi sıralama algoritmaları, yığın veri yapıları kullanılarak daha verimli hale getirilebilir.
# 5) Hanoi Kuleleri
Bu, n sayıda disk ve üç kule içeren klasik bir sorundur ve sorun, disklerin bir kuleden diğerine, ara olarak kullanılan üçüncü kule ile taşınmasını içerir.
Bu sorun, yığın temelde diskleri hareket ettirmek için kullanılan bir kule görevi gördüğünden, diskleri yığının üzerine ittiğimizde, yığın kullanılarak verimli bir şekilde çözülebilir.
Sonuç
Yığın, en basit veri yapısıdır ve bir program olarak uygulanması daha kolaydır. LIFO (son giren, ilk çıkar) yaklaşımını kullandı; bu, en son girilen öğenin ilk kaldırılan olduğu anlamına gelir. Bunun nedeni, yığının öğeleri eklemek (itmek) ve kaldırmak (pop) için yalnızca bir ucu kullanmasıdır.
Yığın veri yapısı, yazılım programlamada birçok kullanıma sahiptir. Bunların başında ifade değerlendirmeleridir. İfade değerlendirmesi, ifadenin infix'ten sonek veya öneke dönüştürülmesini de içerir. Aynı zamanda nihai sonucu elde etmek için ifadenin değerlendirilmesini de içerir.
Bu eğitimde, yığının çizimini ve uygulamasını ve çeşitli işlemlerini gördük.
Yaklaşan eğitimimizde, kuyruk veri yapısı hakkında ayrıntılı olarak bilgi edineceğiz.
=> Uzmanlardan Tam C ++ Kursu İçin Burayı Ziyaret Edin.
Önerilen Kaynaklar
- Çizim ile C ++ 'da Kuyruk Veri Yapısı
- Çizim ile C ++ 'da Dairesel Bağlantılı Liste Veri Yapısı
- Resimli C ++ 'da Bağlantılı Liste Veri Yapısı
- Çizim ile C ++ 'da Öncelik Sırası Veri Yapısı
- Çizim ile C ++ 'da Çift Bağlantılı Liste Veri Yapısı
- C ++ 'da Veri Yapılarına Giriş
- Kullanıcı Tanımlı Değişkenleri Kullanarak JMeter Veri Parametrelendirmesi
- Veri Toplama Stratejileri ile 10'dan Fazla En İyi Veri Toplama Aracı