16 Eylül 2019 Pazartesi

Stack Sınıfı - Kullanmayın (Deque Kullanın)

Giriş
Şu satırı dahil ederiz.
import java.util.Stack;
Açıklaması şöyle.
The Stack class is a legacy class from the Java 1.0 days, prior to the introduction of the collections framework.
Bu sınıf yerine  ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList kullanılabilir. Açıklaması şöyle.
Java's Stack is a very old class, introduced back in JDK 1.0. It extends Vector, and all it's data manipulation methods are synchronized, creating a very sizeable performance overhead. While it isn't officially deprecated, it's outdated, and you really shouldn't be using it in this day and age. The modern ArrayDeque provides the same functionality without the synchronization overhead.
Bu sınıf List arayüzünden kalıtır. listIterator metodu ile ileri ve geri dolaşabilme imkanı sağlar.
Bu sınıf Vector'den kalıtır. Bu yüzden iterator ile dolaşınca Vector gibi çıktı verir.

Örnek
Elimizde şöyle bir kod olsun. Çıktı olarak 1,2,3,4 alırız.
Stack<Integer> s = new Stack<>();

s.push(1);
s.push(2);
s.push(3);
s.push(4);

s.stream().forEach( x-> System.out.print(x + " "));
constructor
Şöyle yaparız.
Stack<Foo> stack=new Stack<Foo>();
isEmpty metodu
Şöyle yaparız.
while (!stack.isEmpty())
{
  stack.pop();
}
listIterator metodu
ListIterator nesnesi döner. Şöyle yaparız.
Stack<Character> var = new Stack<Character>();

... add elements to stack...

for(ListIterator<Character> i = var.listIterator(); i.hasNext();){
  if(i.next() == '*'){
    i.remove();
    i.previous();
    ...  
  }
}
pop metodu
Şöyle yaparız. Eğer stack boş ise EmptyStackException fırlatır.
Foo f=  stack.pop();
push metodu
Şöyle yaparız.
stack.push(myFoo);
Stack'i Tersine Çevirmek
Stack'i tersine çevirerek Queue haline getirebiliriz. Şöyle yaparız.
public class SimulatedQueue<E> {
  Stack<E> stack = new Stack<E>();

  public void insert(E elem) {
    if (!stack.empty()) {
      E topElem = stack.pop();
      insert(elem);
      stack.push(topElem);
    }
    else
      stack.push(elem);
  }

  public E remove() {
    return stack.pop();
  }
}
İki tane stack kullanarak Queue haline getirebiliriz. Şöyle yaparız.
public class Queue<E>
{

  private Stack<E> inbox = new Stack<E>();
  private Stack<E> outbox = new Stack<E>();

  public void queue(E item) {
    inbox.push(item);
  }

  public E dequeue() {
    if (outbox.isEmpty()) {
      while (!inbox.isEmpty()) {
        outbox.push(inbox.pop());
      }
    }
    return outbox.pop();
  }

}

Hiç yorum yok:

Yorum Gönder