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.
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ı:
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:
GO TO FULL VERSION