今天,我试图推入java.util.Stack类,然后使用Iterator迭代(不使用pop)遍历这些项。我本来想要LIFO的,但很惊讶。
这是我试过的密码。
import java.util.*;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
RobStack<Integer> rstack = new RobStack<Integer>(); // Correct Implementation
Stack<Integer> jstack = new Stack<Integer>(); // Default Java Implementation
rstack.push(0); jstack.push(0);
rstack.push(1); jstack.push(1);
rstack.push(2); jstack.push(2);
rstack.push(3); jstack.push(3);
System.out.print("Algo Stack: ");
for (int i : rstack)
System.out.print(i + " ");
System.out.print("\nJava Stack: ");
for (int i : jstack)
System.out.print(i + " ");
}
}上述程序的输出如下:
Algo Stack: 3 2 1 0
Java Stack: 0 1 2 3 在上面的代码中,jstack使用默认的Java实现,而rstack对他的算法类使用Robert Sedgewick提供的实施。我发现罗伯特教授的实现很好,但是java.util.Stack实现失败了。
它是bug还是design
发布于 2013-06-07 20:58:24
见错误ID 4475301 : RFE: java.util.Stack.iterator()以错误的方式迭代。这种行为是由(坏的)设计造成的。Java的内置Stack迭代器方法是从其他类继承的,因此它们的行为不像您所期望的那样。
发布于 2014-12-15 19:33:06
发布于 2013-06-07 21:01:30
从原则上讲,您不应该在Stack上迭代,而应该只从顶部推或从顶部弹出。至于实际的实现,大多数语言,包括Java,都使用另一个collection type来实现Stack。从严格的要求来看,它应该允许恒定时间的push, top and pop操作。
任何附加的特性(或本例中的bug )都应该被忽略,而不是依赖于编码。
https://stackoverflow.com/questions/16992758
复制相似问题