Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java添加到队列前端-deque_Java_Queue_Deque - Fatal编程技术网

Java添加到队列前端-deque

Java添加到队列前端-deque,java,queue,deque,Java,Queue,Deque,这是我在这里的第一个问题,我希望大家都好。我必须为deque或双端队列的数组实现编写代码,但在理解前端方法的enqueue元素时遇到了一些困难,我通过稍作修改使其正常工作,但我仍然很难理解逻辑: void addAtFront(E) { if ( front == 0 ) front = array.length - 1; else front = ( front - 1 ) % array.length; array [front]

这是我在这里的第一个问题,我希望大家都好。我必须为deque或双端队列的数组实现编写代码,但在理解前端方法的enqueue元素时遇到了一些困难,我通过稍作修改使其正常工作,但我仍然很难理解逻辑:

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

    array [front] = element;

    count++;
}

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

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

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

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

综上所述,您应该具有类似的循环逻辑来将元素添加到队列的后面。我猜你已经这么做了基于这个::

else 
    front = ( front - 1 ) % array.length;
我假设您的
addAtBack
方法有以下行:

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

该模运算为您处理循环。如果back超过数组的末尾(也称back为array.length),则模数会将back索引设置为0,并将其循环到数组的开头。不幸的是,这种模运算在另一种情况下并没有那么有效地工作,因此,为什么只需要将if语句添加到前面。您应该能够从
addAtFront
方法中删除该模运算,并将该行替换为
front--

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

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

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

综上所述,您应该具有类似的循环逻辑来将元素添加到队列的后面。我猜你已经这么做了基于这个::

else 
    front = ( front - 1 ) % array.length;
我假设您的
addAtBack
方法有以下行:

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

该模运算为您处理循环。如果back超过数组的末尾(也称back为array.length),则模数会将back索引设置为0,并将其循环到数组的开头。不幸的是,这种模运算在另一种情况下并没有那么有效地工作,因此,为什么只需要将if语句添加到前面。您应该能够从
addAtFront
方法中删除该模运算,并将该行替换为
front--

你应该了解d-bugger是如何工作的,它将向你展示代码是如何工作的以及发生了什么。@HelloWorld,在这个网站上,只要调试他们自己的代码就可以解决的问题太多了。谢谢,我刚刚看了一段视频,eclipse有一个我从来都不知道的非常好的调试器。你应该了解d-bugger是如何工作的。它将向你展示代码的工作原理和发生的事情。@HelloWorld,在这个网站上,通过调试他们自己的代码就可以解决的问题太多了。谢谢,我刚刚看了一段视频,eclipse有一个我从未听说过的非常好的调试器。谢谢,先生,这非常有帮助和直观。谢谢,先生,这非常有帮助和直观。