次の宿題の質問があります。
2つのキューを使用して、スタックメソッドpush(x)およびpop()を実装します。
これは私には奇妙に思えます:
- スタックは(LIFO)キューです
- 実装に2つのキューが必要な理由がわかりません
私は周りを検索しました:
そして、いくつかの解決策を見つけました。これが私がやったことです:
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つのキューバージョンは無意味に複雑に見えます。
上記のように、プッシュのほうが2のほうが効率的でありpush
、同じままでpop
、最後の要素を繰り返してそれを返す必要があるとします。両方の場合において、push
あろうO(1)
、とpop
なるであろうO(n)
。ただし、単一キューバージョンは大幅にシンプルになります。単一のforループのみが必要です。
何か不足していますか?ここで洞察をいただければ幸いです。