CodeGym /Java Blogu /Rastgele /Java Yığını
John Squirrels
Seviye
San Francisco

Java Yığını

grupta yayınlandı
Java'da Stack, genellikle List arabirimini uygulayan Collection Framework sınıfı anlamına gelir. Bellek türlerinden birini düzenlemek için kullanılan Stack veri yapısı ilkesine göre çalışır. Ayrıca hafızanın veri tutan kısmı da olabilir. Bu yazımızda öncelikle Stack sınıfına dikkat edeceğiz, metotlarını ele alacağız ve örnekler vereceğiz. Ancak Stack gibi bir veri yapısından ve ne için kullanıldığından da bahsedeceğiz .

Yığın Veri Yapısı Nedir?

Öncelikle yığın veri yapısının ne olduğuna hızlıca bir göz atalım. Son Giren İlk Çıkar (LIFO) ilkesine dayalı doğrusal bir veri yapısıdır. Bir nevi sıra karşıtı. Bir kutuda bir iskambil destesi veya bir yığın kitap düşünün. Yığına ilk koyduğunuz kitap en alttadır ve kutudan ilk çıkaracağımız kitap en üstte olan, yani kutuya en son giren kitaptır. İşte bu prensibi göstermek için bir gif resmi. Java Yığını - 1Burada neler oluyor? Bir seferde yalnızca bir topun çarpabileceği bir şişemiz var. Şişedeki ilk turuncu top, sonra mor ve son olarak yeşil (bu renklerin daha doğru isimlerini bilenlerden özür dilerim). Bununla birlikte, şişe yığınımızdan turuncu bir topu çıkarmak için, önce oraya en son varan topu (yeşil olan), ardından sondan bir önceki topu (ancak çıkarma sırasında sonuncusu) çıkarmamız gerekir. bir). Java'daki veya programlamanın başka bir yerindeki yığın veri yapısı en önemli iki işleme sahiptir: push ve pop . İtme işlemi, yığına bir öğe ekler ve pop işlemi, yığının tepesinden bir öğeyi kaldırır.

Yığın veri yapısı ne için?

Yığının en önemli kullanımlarından biri, alt program çağrılarını düzenlemektir. Yığın üzerindeki çağrı noktası, alt program sona erdikten (ve muhtemelen geçirilen parametrelerden) sonra dönüş adresini saklar. Her iç içe geçmiş (yinelemeli dahil) altyordam çağrısıyla, yığına yeni dönüş adresleri eklenir. Alt programdan (dönüş) her dönüş işleminde, dönüş adresi yığından kaldırılır ve kontrol ona aktarılır. Bu uygulama, programlama için o kadar önemlidir ki, çoğu işlemcide dönüş yığını, komut setindeki donanımda uygulanır. Ancak diğer durumlarda yığının daha genel veri yapılarına göre modellenmesi gerekir.

Koleksiyon Çerçevesinin Java Stack Sınıfı

Java Stack Class'ta, Collection çerçevesinden List arayüzünü uygulayan ve Vector sınıfını genişleten bir sınıftır. Ayrıca Collection, Iterable, Cloneable, Serializable arayüzlerini uygular. Muhtemelen zaten tahmin ettiğiniz gibi, bu sınıf LIFO nesne yığınını temsil eder. İşte Stack sınıfının yapıcısına yapılan çağrı , yani bu sınıfa ait bir nesnenin oluşturulması.

Stack<E> stack = new Stack<E>();
Burada E, Nesnenin türüdür.

Java Yığın Yöntemleri

Bu sınıfın yalnızca bir varsayılan kurucusu ve Vector sınıfının tüm yöntemleri vardır . Artı, Stack'in kendi 5 yöntemi vardır:
  • boolean empty() yöntemi yığının boş olup olmadığını kontrol eder. Stack boşsa true , değilse false döndürür .

  • Object peek() yöntemi, yığının en üstündeki öğeyi döndürür.

  • Object pop() yöntemi, yığının en üstünde bulunan öğeyi döndürür ve onu kaldırır.

  • Object push(Object element) yöntemi, belirtilen elemanı yığının en üstüne ekler.

  • int search(Object öğesi) yöntem, belirtilen öğe için yığını arar. Gerekli eleman bulunursa, üstten “mesafesi” (seri numarası) döndürülür. Eleman bulunamazsa, -1 döndürülür.

Yığın kodu örneği

Yukarıdaki gif resmi gibi çalışan bir program örneği oluşturalım. Yığının üzerine turuncu, mor ve yeşil olmak üzere üç "top" koyacağız. Yığında boşluk olup olmadığını kontrol edelim. Ardından, yığın boşalana kadar yığından topları çıkaracağız.

import java.util.Stack;

public class myStackTest2 {

       public static void main(String[] args)
       {

           Stack myStack= new Stack<>();

           System.out.println("Is my stack empty? " + myStack.empty());
// pushing elements into stack
           myStack.push("Orange Ball");
           myStack.push("Violet Ball");
           myStack.push("Green Ball");

//prints elements of the stack
           System.out.println("Elements in Stack: " + myStack);
           System.out.println("Is my stack empty? " + myStack.empty());
           while (!myStack.isEmpty()) {
               myStack.pop();
               System.out.println("Elements in Stack: " + myStack);
               System.out.println("Is my stack empty? " + myStack.empty());
           }
       }
   }
İşte bu programın çıktısı:
Yığınım boş mu? Yığındaki gerçek Öğeler: [Turuncu Top, Mor Top, Yeşil Top] Yığınım boş mu? Yığındaki yanlış Öğeler: [Turuncu Top, Mor Top] Yığınım boş mu? Yığındaki yanlış Öğeler: [Turuncu Top] Yığınım boş mu? false Yığındaki Öğeler: [] Yığınım boş mu? doğru
Stack , Vector Class'tan miras alındığından ve List arabirimini uyguladığından , Stack , bu veri yapısı için öğe ekleme ve ayıklamaya yönelik klasik push ve pop işlemlerine ek olarak, liste yapısı add() ve remove() işlemleri için de standarda sahiptir. Örneğimizde, öğe ekleme, add() yöntemi kullanılarak aynı şekilde uygulanabilir. Ancak, yalnızca belirtilen bir öğeyle remove() kullanarak ayıklayabilirsiniz , bu yığın veri yapısı için hiçbir anlam ifade etmez.

import java.util.Stack;

public class myStackTest2 {

       public static void main(String[] args)
       {

           Stack myStack= new Stack<>();

           System.out.println("Is my stack empty? " + myStack.empty());
// pushing elements into stack
           myStack.add("Orange Ball");
           myStack.add("Violet Ball");
           myStack.add("Green Ball");

//prints elements of the stack
           System.out.println("Elements in Stack: " + myStack);
           System.out.println("Is my stack empty? " + myStack.empty());
           while (!myStack.isEmpty()) {
               myStack.pop();
               System.out.println("Elements in Stack: " + myStack);
               System.out.println("Is my stack empty? " + myStack.empty());
           }
       }
   }
Program çalışmasının sonucu elbette tamamen aynı olacaktır.

Peki ya kendi Yığın uygulamanız?

Dizileri veya bağlantılı liste sınıflarını kullanarak Java'da kendi yığın veri yapınızı oluşturabilirsiniz. İlk durumda, gerektiğinde kullanılan değerleri bellekte depolamak için sürekli bir hücre dizisi tahsis edilir. İkincisinde, yığının her bir öğesi için, yığının önceki ve sonraki öğelerinin değerini ve referanslarını saklamak için yeterli bir bellek bloğu sıralanır. Dizi tabanlı uygulama daha basit, daha verimli ve daha fazla bellek verimlidir, ancak yığın boyutu sınırı hakkında önceden bilgi gerektirir ve bulunması zor hatalara yol açabilir. Liste tabanlı uygulama daha sağlamdır ancak daha az verimlidir. Yığının basit bir dizi tabanlı uygulamasını yapalım. İşlevleri içerecektir.
  • push — bir öğenin eklenmesini sağlayacak bir yöntem (en üst konumda)

  • pop — bir öğenin kaldırılmasını sağlayacak bir yöntem (en üst konumdan)

  • readTop — üst konumdaki öğenin değerini döndürecek bir yöntem

  • sEmpty — yığının boş olup olmadığını kontrol edecek bir yöntem

  • isFull — yığını sakladığımız dizimizin dolu olup olmadığını kontrol edecek bir yöntem


import java.util.Arrays;

public class MyStack {

   private int maxSize;
   private String[] stackArray;
   private int top;

   public MyStack(int size) {
       this.maxSize = size;
       stackArray = new String[maxSize];
       top = -1;
   }

   public String push (String element) {
       return stackArray[++top] = element;
      
   }

   public String pop (String element) {

       if (isEmpty())
       {
           System.out.println("Underflow\nProgram Terminated");
           System.exit(-1);
       }

       System.out.println("Removing " + readTop());
      
       return stackArray[top--];

   }

   public String readTop() {
       return stackArray[top];

   }

   public boolean isEmpty() {
       return (top ==  -1);
   }

   public boolean isFull() {
       return (top == maxSize - 1);
   }

   public void printStack(){
       System.out.println(Arrays.toString(stackArray));
   }
}
Şimdi yığınımıza göre üç toplu bir örnek uygulayalım:

public class myStackTest {
   public static void main(String[] args) {
       MyStack  myStack = new MyStack(3);
       System.out.println("Is my stack empty? " + myStack.isEmpty());

       myStack.push("Orange Ball");
       myStack.push("Violet Ball");
       myStack.push("Green Ball");

      myStack.printStack();

       System.out.println("Is my stack empty? " + myStack.isEmpty());
       while (!myStack.isEmpty()) {
           myStack.pop(myStack.readTop());
           System.out.println("Is my stack empty? " + myStack.isEmpty());
       }
   }

}
Çıktı burada:
Yığınım boş mu? true [Turuncu Top, Menekşe Top, Yeşil Top] Yığınım boş mu? false Yeşil Top Çıkarılıyor Yığınım boş mu? false Violet Ball Kaldırılıyor Yığınım boş mu? false Turuncu Top Çıkarılıyor Yığınım boş mu? doğru
Yakından bakarsanız, en üstteki değişken aslında son öğenin dizinini içerir ve nesneye yapılan başvuru dizide kalır. Dolayısıyla bu uygulamanın biraz iyileştirilmesi gerekiyor. Bunu yapmanın en kolay yolunu düşünün.

Java Stack kullanmalı mıyız?

Aslında Java Stack , Vector ebeveyni gibi eski bir sınıftır. Bunun yerine genellikle ArrayList sınıfı kullanılır. ArrayList, Vector senkronize edilirken senkronize edilmez . Bu, Vector ile aynı anda yalnızca bir iş parçacığının koda erişebileceği, ArrayList'in ise birden çok iş parçacığıyla çalışabileceği anlamına gelir. Ayrıca, ArrayList daha verimli ve daha hızlıdır. Bu nedenle, büyük olasılıkla bu sınıfı yalnızca eski kodda göreceksiniz. Ancak Yığın veri yapısı programlamada çok sık kullanılır.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION