Java 对于我的代码,为什么出列不能正常工作?

Java 对于我的代码,为什么出列不能正常工作?,java,stack,queue,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

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

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

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();
}
public T dequeue()抛出NoTouchElementException{
而(!s1.isEmpty()){
T tmp=s1.pop();
s2.推送(tmp);
}
堆栈温度=新堆栈();
温度=s1;
s1=s2;
s2=温度;
返回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());
}
@测试
public void testtwolement(){
队列q=新队列();
q、 排队(42);
q、 排队(51);
q、 排队(86);
资产质量(3,q.size());
assertEquals(新整数(42),q.dequeue());
assertEquals(新整数(51),q.dequeue());
assertEquals(新整数(86),q.dequeue());
assertEquals(0,q.size());
assertEquals(true,q.isEmpty());
}

我无法理解为什么会发生这样的事情。如果有人能告诉我代码出了什么问题,我将不胜感激。

这里不需要交换
s1
s2
。删除代码的交换行并替换
return s1.pop()返回s2.pop()
我假设您总是将排队元素推入
s1

此外,只有当
s2
没有弹出内容时,才需要将元素从
s1
移动到
s2

public T dequeue() throws NoSuchElementException {

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


    return s2.pop();
}

原因是,当您第二次调用dequeue时,您正在重新订购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在其他回答中已经添加了实现。

s1和s2是什么?你们能在队列上发布完整的代码吗?看来你的while有问题了。