Manhar:
私は2つのスタックを使用してキューのコードを作ってきました。しかし、コードのデキュー部分は、それが適切に試験の最初の要素を削除して、不気味に動作しているが、第二及び第三の要素は、間違った順序を有しています。
これは私が使用しています、デキューコードです。
public T dequeue() throws NoSuchElementException {
while(!s1.isEmpty()){
T tmp = s1.pop();
s2.push(tmp);
}
Stack<T> temp = new Stack<>();
temp = s1;
s1 = s2;
s2 = temp;
return s1.pop();
}
これは、51と86のために逆の順序を与えているテストケースのコードです。
@Test
public void testTwoElement() {
Queue<Integer> q = new Queue<>();
q.enqueue(42);
q.enqueue(51);
q.enqueue(86);
assertEquals(3, q.size());
assertEquals(new Integer(42), q.dequeue());
assertEquals(new Integer(51), q.dequeue());
assertEquals(new Integer(86), q.dequeue());
assertEquals(0,q.size());
assertEquals(true,q.isEmpty());
}
私はそれがこのように起こっている理由を、理解することはできませんよ。コードで間違って何が起こっているのか、誰かが私に言うことができる場合、私は幸いです。
HariUserX:
その理由は、あなたがデキュー二度目を呼び出すときに、S1を再注文することにあります。
これは、以下に説明します
初期状態:
S1:86 - > 51 - > 42
最初のデキュー:
S1:86 - > 51 - > 42
S2:
S1を空とs2に要素を追加します。
S1:
S2:42 - > 51 - > 86
今、スワップs1とs2:
S1:42 - > 51 - > 86
S2:
今ポップs1とリターン42:
S1:51 - > 86
第二デキュー:
S1:51 - > 86
S2:
S1を空とs2に要素を追加します。
S1:
S2:86 - > 51
今、スワップs1とs2:
S1:86 - > 51
S2:
今ポップs1とリターン86:
S1:51
これを解決する正しい方法は、S2とS1を交換しないようにとS1で終了し、その後再投入S2にS2内のすべての要素を待つことです。それはすでにmangustaにより他の回答で行われているように私は、実装を追加しておりません。