Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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 特殊类型队列_Java_Collections_Queue - Fatal编程技术网

Java 特殊类型队列

Java 特殊类型队列,java,collections,queue,Java,Collections,Queue,我正在寻找一种类似队列的东西,它允许我将元素放在队列的末尾,并像常规队列一样在开始时将它们弹出 不同之处在于,我还需要不时压缩队列。也就是说,假设我的队列中有以下项目(每个字符,包括点,都是队列中的一个项目): 然后,例如,我需要删除最后一个点,以便获得: e d . c . b a Java集合类中有类似的东西吗?我需要将它用于我正在做的一个程序,在这个程序中,除了Java的类之外,我什么都不能用。我不允许为自己设计一个。目前我只是使用一个LinkedList,但我想这可能更像是一个队列而不

我正在寻找一种类似队列的东西,它允许我将元素放在队列的末尾,并像常规队列一样在开始时将它们弹出

不同之处在于,我还需要不时压缩队列。也就是说,假设我的队列中有以下项目(每个字符,包括点,都是队列中的一个项目):

然后,例如,我需要删除最后一个点,以便获得:

e d . c . b a
Java集合类中有类似的东西吗?我需要将它用于我正在做的一个程序,在这个程序中,除了Java的类之外,我什么都不能用。我不允许为自己设计一个。目前我只是使用一个LinkedList,但我想这可能更像是一个队列而不是LinkedList

谢谢

编辑:

基本上,以下是该项目的内容: 有一个红绿灯可以是绿色(相关符号为“-”)或红色(“|”)。那个红绿灯在右边: 在Begging中,您没有任何汽车,交通灯是绿色的,因此我们的列表表示为:

.......  -
现在,在下一次迭代中,我有一个随机变量,它会告诉我哪里有车来,哪里没有车来。如果有车来了,我们可以看到它从左边出现。在每次迭代中,所有车辆都向右移动一步。如果他们右边有车,他们就不能移动:

a......  -   (iteration 1)
.a.....  -   (iteration 2)
..a....  -   (iteration 3)
等等

现在,发生的情况是,有时交通灯会变成红色(“-”)。在这种情况下,如果你有几辆车,那么即使它们在移动时有一定的距离,当它们必须停下来等待红绿灯时,它们也会靠近:

...b.a.  -   (iteration n)
....b.a  -   (iteration n+1)
.....ba  -   (iteration n+2) here they got close to each other
现在,这就是为什么它像一个队列一样工作的原因,但有时我必须记下这些点,当汽车靠近红灯时。
请记住,此处街道的大小为7个字符,但有时会变大,因此我们不能假设这是一个固定长度的列表。

可能是第二个保留点元素的LinkedList?

我想说LinkedList是此处的最佳方法。。。由于链接列表允许您从前面/后面推/弹出,并允许您删除列表中间的项。
显然,查找时间很糟糕,但是如果您在列表的前/后添加/删除的次数比查找次数要多,那么我会说坚持使用LinkedList。

队列基本上是一个具有定义行为的项目列表,在这种情况下是FIFO(先进先出)。您可以在末尾添加项,然后从开头删除它们

现在,您可以选择任何方式实现队列;使用链表或数组。我认为你走的路是对的。链表肯定会让事情变得更简单

对于队列中的添加和删除,您将有O(1)(如果您保持对前面和后面的引用),但是压缩(删除点)的最坏情况是O(n)

我相信如果使用二级数据结构,可能会有一种方法将
压缩操作减少到O(1)(如果一次只删除一个点)。您需要的是另一个队列(使用另一个链表实现),该队列维护对第一个链表中点的引用

因此,当您插入(a,,,b,c,,,d)时,您有一个如下所示的列表:

[pointer to rear] -> [d] -> [.] -> [c] -> [b] -> [.] -> [a] <- [pointer to front]

[指向后方的指针]->[d]->[.]->[c]->[b]->[.]->[a][参考第二个点]->[参考第一个点]家庭作业/学校项目总是很棘手,给需求增加了微妙的东西,可能会让人的大脑崩溃。您是否要求将空格作为队列的一部分

就个人而言,除非明确要求,否则我不会这样做:将汽车表示为汽车、空间对似乎更简单,(假设允许使用结构,您可以将汽车对定义为结构),其中空间是一个数值,表示汽车中下一辆车的空间。然后,要压缩,您只需要查看列表项:当您找到一个具有
Space>0
的项时,执行
Space--;返回,所有其他汽车都已经“先进”,因为它们与前面的汽车保持空间。为了输出,请确保在车辆本身之后(如果停车灯位于右侧,车辆从左侧驶出)或之前(停车灯位于左侧,车辆从右侧驶出)为每辆车抛出
空格
点,然后开始。还要注意的是,第一辆车的
空间
表示到红绿灯本身的距离,因为前面没有车

如果向结构中添加指向下一辆车的指针(以及最后一辆车的空指针),则已经有了一个链表:保留一个指向第一辆车的“全局”变量(或空队列为空)。由于Java不直接支持指针,所以将结构转换为类并使用“对象引用”(除了C'ish指针算术之外,其他用途都与指针相同),这样就可以了:只有一个类是从头构建的。您需要从Java的库中接触的唯一东西是标准IO,可能还有一点字符串操作,这是从必须进行输入和生成输出中派生出来的固有需求(一些大学有自己的特定于课程的IO库,但这在这里并没有太大区别)。要在队列中循环,您可以这样做(假设类名为“Node”,这是非常通用的,并且字段的名称很明显):

要添加新节点,您可能必须遍历队列,以确定新车“繁殖”到最后一个节点的距离;执行此操作时,保留最后一个节点的引用,并将其“下一个”引用点设置为新节点:

Node last = First;
int distance = 0;
for(Node pos = First; pos != null; pos=pos.Next) {
    distance += pos.Space;
    last = pos;
}
last.Next = new Node(the_letter_for_this_car, MaxDistance-distance, null);
当然,将构造函数调整到您拥有的任何内容

考虑到这是一个大学项目,让我们来看看一些细节:紧凑的进程时间变成<代码> O(n)< /代码>,它的内存使用是<代码> O(0)。

[pointer to rear] -> [reference to second dot] -> [reference to first dot] <- [pointer to front]
for(Node pos = First; pos != null; pos = pos.Next) {
    /* Do your stuff here, knowing that "pos" points to the "current" item on each iteration. */
}
Node last = First;
int distance = 0;
for(Node pos = First; pos != null; pos=pos.Next) {
    distance += pos.Space;
    last = pos;
}
last.Next = new Node(the_letter_for_this_car, MaxDistance-distance, null);