Saya memiliki pertanyaan pekerjaan rumah berikut:
Terapkan metode stack push (x) dan pop () menggunakan dua antrian.
Ini aneh bagi saya karena:
- Stack adalah antrian (LIFO)
- Saya tidak mengerti mengapa Anda perlu dua antrian untuk mengimplementasikannya
Saya mencari di sekitar:
dan menemukan beberapa solusi. Inilah yang akhirnya saya dapatkan:
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;
}
}
Tapi saya tidak mengerti apa kelebihannya daripada menggunakan satu antrian; versi dua antrian tampaknya rumit tanpa tujuan.
Katakanlah kita memilih untuk mendorong menjadi lebih efisien dari 2 (seperti yang saya lakukan di atas), push
akan tetap sama, dan pop
hanya akan membutuhkan iterasi ke elemen terakhir, dan mengembalikannya. Dalam kedua kasus, push
akan menjadi O(1)
, dan pop
akan menjadi O(n)
; tetapi versi antrian tunggal akan lebih sederhana secara drastis. Seharusnya hanya membutuhkan satu loop.
Apakah saya melewatkan sesuatu? Setiap wawasan di sini akan dihargai.