Aşağıdaki ev ödevi sorum var:
İki kuyruk kullanarak push (x) ve pop () yöntemlerini uygulayın.
Bu bana tuhaf geliyor çünkü:
- Bir yığın olan bir çıkar (LIFO) sıra
- Neden uygulamak için iki kuyruğa ihtiyaç duyduğunuzu anlamıyorum
Etrafı araştırdım:
ve birkaç çözüm buldum. Ben de bununla bitirdim:
public class Stack<T> {
LinkedList<T> q1 = new LinkedList<T>();
LinkedList<T> q2 = new LinkedList<T>();
public void push(T t) {
q1.addFirst(t);
}
public T pop() {
if (q1.isEmpty()) {
throw new RuntimeException(
"Can't pop from an empty stack!");
}
while(q1.size() > 1) {
q2.addFirst( q1.removeLast() );
}
T popped = q1.pop();
LinkedList<T> tempQ = q1;
q1 = q2;
q2 = tempQ;
return popped;
}
}
Ancak, tek bir sıra kullanmanın avantajının ne olduğunu anlamıyorum; iki sıra sürümü anlamsız bir şekilde karmaşık görünüyor.
Diyelim ki, ittirmenin 2'nin daha verimli olması için (yukarıda yaptığım gibi), push
aynı kalacaktı ve pop
sadece son öğeye yinelemeyi ve geri döndürmeyi gerektireceğini söyledik. Her iki durumda da, push
olur O(1)
ve pop
olur O(n)
; ancak tek kuyruk sürümü çok daha basit olurdu. Döngü için sadece bir tek gerekir.
Bir şey mi kaçırıyorum? Buradaki herhangi bir fikir takdir edilecektir.