为什么出队不适用于我的代码?

时间:2019-01-16 04:37:39

标签: java stack queue

我使用两个堆栈为队列编写了代码。但是代码的出队部分表现出怪异,它正确地删除了测试中的第一个元素,但是第二个和第三个元素的顺序错误。

这是出队代码,我正在使用:

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());
}

我无法理解为什么发生这种情况。如果有人可以告诉我代码出了什么问题,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

此处无需交换s1s2。删除代码的交换行,并将return s1.pop();替换为return s2.pop();
我假设您总是将排队的元素推入s1中。
另外,仅当s1不需要弹出时,才需要将元素从s2移动到s2

public T dequeue() throws NoSuchElementException {

if(s2.isEmpty())
{
  while(!s1.isEmpty()){
    T tmp = s1.pop();
    s2.push(tmp);
  }
}


    return s2.pop();
}

答案 1 :(得分:1)

原因是第二次调用出队时您正在重新排序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

解决此问题的正确方法是不要将s1与s2交换,而是等待s2中的所有元素完成,然后再用s1填充s2。我没有添加实现,因为在mangusta的其他答案中已经完成了。