我创建了一个双重列表,如下所示。
List<Stack<Vertex>> allPaths = new ArrayList<Stack<Vertex>>();
当我通过执行DFS收集堆栈中的所有路径并尝试使用for each iterator over stack collection打印每个堆栈时,它按FIFO顺序打印。
void print(List<Stack<Vertex>> allPaths){
for(Stack<Vertex> eachPath : allPaths){
for(Vertex eachVertex: eachPath){
System.out.print(eachVertex.name+" ");
}
System.out.println();
} // end of stack iterator
} // end of print() function
因此,如果每个节点访问完成的顺序是:4-> 3-> 2-> 1,则打印4-> 3-> 2-> 1。什么是最好的集合在这里使用而不是堆栈来获得LIFO订单?似乎迭代器返回堆栈的行为存在问题。它在LIFO中不起作用。
答案 0 :(得分:1)
Stack
是Java 1.0的遗留类,扩展了Vector
。 Vector
是Java 1.0中的遗留类,它是较新ArrayList
的同步版本。
由于Vector
由数组支持,因此将项目推送到堆栈意味着追加到数组(前置不会很好)。弹出值意味着从数组中删除最后值。作为堆栈,功能是正确的,但值以FIFO顺序物理存储在数组中。
如上所述,它们是遗留类,你不应该使用它们,例如Stack
的javadoc说:
Deque
接口及其实现提供了一套更完整,更一致的LIFO堆栈操作,应优先使用该类。
Deque
的javadoc说:
Deques也可以用作LIFO(后进先出)堆栈。应优先使用此接口,而不是旧版
Stack
类。当deque用作堆栈时,元素将从 deque的开头推送和弹出。
因此,迭代Deque
将看到LIFO顺序中的元素,而迭代Stack
将看到FIFO顺序中的元素。但是,两者都可以正常工作。
答案 1 :(得分:-1)
使用stack.pop
Stack<Integer> stack = new Stack<>();
stack.push(4);
stack.push(3);
stack.push(2);
stack.push(1);
while (!stack.empty()) {
System.out.println(stack.pop());
}