【问题标题】:Java adding to the front of queue - dequeJava 添加到队列的前面 - deque
【发布时间】:2015-12-22 21:02:04
【问题描述】:

这是我在这里的第一个问题,我希望每个人都很好。我必须编写一个双端队列或双端队列的数组实现,但在理解前面方法的入队元素时遇到了一些麻烦,我通过摆弄它来让它工作,但我仍然很难理解逻辑:

void addAtFront(E)
{
    if ( front == 0 )
        front = array.length - 1;
    else 
        front = ( front - 1 ) % array.length;

    array [front] = element;

    count++;
}

有人能解释一下 if 语句中发生了什么吗?如果front是0,那么我们在数组的末尾一直添加一个元素?那不就和排在后面一样吗?

【问题讨论】:

  • 你应该了解一个 d-bugger 是如何工作的,它会准确地告诉你代码是如何工作的以及发生了什么。
  • @HelloWorld,在这个网站上被问到的问题数量惊人,只需调试自己的代码就能解决
  • 谢谢,我刚刚看了一个视频,eclipse有一个非常好的调试器,我从来不知道。

标签: java queue deque


【解决方案1】:

您正在使用所谓的循环数组来存储这个双端队列。本质上,您的逻辑以这样一种方式工作,即您用于存储队列的数组在末尾循环并返回到开头,反之亦然。

当您需要将一个元素添加到队列的前面时,您需要将它向左展开,但是当您处于实际数组实现的开始时(也就是当前面索引为零时),它已经尽可能地向左了。解决方案是循环到最后,假装数组是一个大圆圈。

您可以在逻辑上这样做的原因是您的数组和队列实际上并不相同;该数组仅包含您的队列。您可以使用前变量和后变量来跟踪可以在数组中找到队列元素的位置。这意味着数组的最后一个元素不一定是队列中的最后一个元素。您的队列可以随心所欲地沿着数组遍历和增长。数组对队列施加的唯一限制是大小;数组显然不能容纳比它大的队列。

说了这么多,你应该有类似的循环逻辑来添加一个元素到队列的后面。我猜你已经这样做了::

else 
    front = ( front - 1 ) % array.length;

我假设你的 addAtBack 方法有这一行:

back = (back + 1) % array.length;

模数运算会为您处理循环。如果后面超出数组的末尾(也就是数组的长度),模数会将后面的索引设置为 0,将其循环到数组的开头。不幸的是,模数运算在相反的情况下不能有效地工作,因此为什么您需要 if 语句仅用于添加到前面。您应该能够从您的 addAtFront 方法中删除该模运算并将该行替换为 front--;

【讨论】:

  • 谢谢您,先生,这非常有用且直观。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多