ฉันมีคำถามทำการบ้านต่อไปนี้:
ใช้วิธีการซ้อน (x) และ pop () โดยใช้สองคิว
ดูเหมือนว่าจะแปลกสำหรับฉันเพราะ:
- Stack คือคิว (LIFO)
- ฉันไม่เห็นว่าทำไมคุณต้องใช้สองคิวในการติดตั้ง
ฉันค้นหารอบ ๆ :
และพบวิธีแก้ไขปัญหาสองสามข้อ นี่คือสิ่งที่ฉันลงเอยด้วย:
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;
}
}
แต่ฉันไม่เข้าใจว่าข้อดีคืออะไรมากกว่าการใช้คิวเดียว รุ่นคิวสองดูเหมือนซับซ้อนอย่างไม่มีจุดหมาย
สมมติว่าเราเลือกที่จะให้การผลักดันให้มีประสิทธิภาพมากขึ้นใน 2 (อย่างที่ฉันทำข้างต้น) push
จะยังคงเหมือนเดิมและpop
จะต้องทำการวนซ้ำกับองค์ประกอบสุดท้าย ในทั้งสองกรณีpush
จะเป็นO(1)
และpop
จะเป็นO(n)
; แต่รุ่นคิวเดียวจะง่ายขึ้นอย่างมาก มันควรจะต้องการเพียงหนึ่งเดียวสำหรับวง
ฉันพลาดอะไรไปรึเปล่า? ความเข้าใจใด ๆ ที่นี่จะได้รับการชื่นชม