无法使用堆栈集合以LIFO顺序读取

时间:2016-05-30 02:44:31

标签: java generics collections stack depth-first-search

我创建了一个双重列表,如下所示。

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中不起作用。

2 个答案:

答案 0 :(得分:1)

Stack是Java 1.0的遗留类,扩展了VectorVector是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());
}