なぜデキュー私のコードのために正常に動作していませんか?

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により他の回答で行われているように私は、実装を追加しておりません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=211937&siteId=1