Tôi có câu hỏi bài tập về nhà sau đây:
Thực hiện các phương thức ngăn xếp đẩy (x) và pop () bằng hai hàng đợi.
Điều này có vẻ kỳ lạ với tôi bởi vì:
- Một ngăn xếp là một hàng đợi (LIFO)
- Tôi không thấy lý do tại sao bạn cần hai hàng đợi để thực hiện nó
Tôi tìm kiếm xung quanh:
và tìm thấy một vài giải pháp. Đây là những gì tôi đã kết thúc với:
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;
}
}
Nhưng tôi không hiểu lợi thế của việc sử dụng một hàng đợi là gì; hai phiên bản xếp hàng dường như vô cùng phức tạp.
Giả sử chúng tôi chọn các lần đẩy để hiệu quả hơn trong số 2 (như tôi đã làm ở trên), push
sẽ vẫn như cũ và pop
chỉ cần yêu cầu lặp lại thành phần cuối cùng và trả lại nó. Trong cả hai trường hợp, push
sẽ là O(1)
, và pop
sẽ là O(n)
; nhưng phiên bản xếp hàng đơn sẽ đơn giản hơn nhiều. Nó chỉ nên yêu cầu một vòng lặp duy nhất.
Tui bỏ lỡ điều gì vậy? Bất kỳ cái nhìn sâu sắc ở đây sẽ được đánh giá cao.