Stack (yığın) veri yapısı ile Last-In-First-Out (LIFO) yani son giren ilk çıkar mantığıyla çalışmasını istediğimiz durumları gerçekleriz. Bu yazımızda Java'da java.util.Stack nasıl kullanılır sorumuza tabak yıkama kod örneği ile yanıt arayacağız.
Java'da Stack Kullanımı |
Öncelikle bir tabak modeli sınıfı tanımlayalım. Aşağıdaki gibi bir Plate.java sınıfı oluşturalım.
public class Plate { private boolean isClean; private int id; public Plate(int id) { this.id = id; } public boolean isClean() { return isClean; } public void setClean(boolean isClean) { this.isClean = isClean; } public int getId() { return id; } }
Tabak modelimizde tabağın kirli mi temiz mi olduğu bilgisini tutmak için boolean isClean alanını tanımladık. id alanı ile de tabakların üretim sırasını id olarak belirledik.
Stack'e Eleman Ekleme: push()
Senaryomuz şu şekilde çalışacak. Kirli tabakları üst üste koyan, yani stack veri yapımıza push() metodu ile ekleyen bir TimerTask tanımlayacağız ve bu her 1 saniyede bir kirli tabak üretip Stack veri yapımıza ekleyecek.
Stack'ten Eleman Çıkarma: pop()
Daha sonra bu kirli tabakları temizlemek için de 2 saniyede bir çalışan bir TimerTask tanımlayacağız.
Bu temizleme taskında stack veri yapımızdan pop() metodu ile kirli tabakların en üstündeki tabak, yani stack yapımıza en son eklenen tabak alınacak ve temizlenecek.
Stack Tepesindeki Elemana Silmeden Ulaşma: peek()
Stack veri yapımızdaki en son eklenen, yani bir sonraki pop() metod çağrısıyla ulaşabileceğimiz elemana, stackten silmeden ulaşmak için peek() metodunu kullanabiliriz.
Bu arada Java'da Timer ve TimerTask kullanımı örneği için şuraya bakabilirsiniz.
Senaryomuzu koşacağımız main metodunu içeren StackExample.java sınıfı aşağıdaki gibidir:
import java.util.Stack; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicInteger; public class StackExample { public static void main(String[] args) { Stack<Plate> stack = new Stack<>(); Timer timer = new Timer("SmartyCoder Timer"); final AtomicInteger plateIndex = new AtomicInteger(); TimerTask putOnTopOfPlatesTask = new TimerTask() { @Override public void run() { Plate plate = new Plate(plateIndex.incrementAndGet()); plate.setClean(false); stack.push(plate); System.out.println("Bir adet kirli tabak eklendi. Tabak id: " + plate.getId()); } }; // dirtyfy one plate every second timer.scheduleAtFixedRate(putOnTopOfPlatesTask, 0, 1000); TimerTask cleanPlate = new TimerTask() { @Override public void run() { Plate plate = stack.pop(); plate.setClean(true); System.out.println(plate.getId() + " id'li tabak temizlendi. Kalan kirli tabak sayisi: " + stack.size()); } }; timer.scheduleAtFixedRate(cleanPlate, 1000, 2000); } }
Bu örnek projemizi çalıştırdığımızda konsoldaki çıktı şu şekilde olacaktır.
>
Bir adet kirli tabak eklendi. Tabak id: 1
Bir adet kirli tabak eklendi. Tabak id: 2
2 id'li tabak temizlendi. Kalan kirli tabak sayisi: 1
Bir adet kirli tabak eklendi. Tabak id: 3
Bir adet kirli tabak eklendi. Tabak id: 4
4 id'li tabak temizlendi. Kalan kirli tabak sayisi: 2
Bir adet kirli tabak eklendi. Tabak id: 5
Bir adet kirli tabak eklendi. Tabak id: 6
6 id'li tabak temizlendi. Kalan kirli tabak sayisi: 3
Bir adet kirli tabak eklendi. Tabak id: 7
Bir adet kirli tabak eklendi. Tabak id: 8
8 id'li tabak temizlendi. Kalan kirli tabak sayisi: 4
Bir adet kirli tabak eklendi. Tabak id: 9
Bir adet kirli tabak eklendi. Tabak id: 10
10 id'li tabak temizlendi. Kalan kirli tabak sayisi: 5
Bir adet kirli tabak eklendi. Tabak id: 11
Java stack tabak yıkama output |
Çıktıdan da anlaşılacağı üzere, stack'e push() metodu ile en son eklenen tabak pop() metodu ile elde ediliyor. Stack'te kirli tabak sayısı sürekli artıyor. Peki sizce stack'te hiç kirli tabak kalmaması için TimerTask çalışma periyotları ne olmalı?
0 Yorumlar