2016-05-30 3 views
-2

Я создал двойной список, как показано ниже.Невозможно прочитать в порядке LIFO с использованием коллекции стека

List<Stack<Vertex>> allPaths = new ArrayList<Stack<Vertex>>(); 

Когда я собираю все пути в стек, делая DFS и попытаться напечатать каждый стек, используя для каждого итератора над коллекции стека, он печатает в порядке их поступления.

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

@EJP Я уже упомянул, что в вопросе. В любом случае спасибо – Zack

ответ

1

Stack является наследием класс от Java 1.0, который расширяет Vector. Vector - унаследованный класс от Java 1.0, который является синхронизированной версией ArrayList.

С Vector подкрепляется массив, нажимая предметы в стеке, означает , добавляя к массиву (добавление не будет работать хорошо). Вычисление значений означает удаление последнего значения из массива. Как стек, функциональность верна, но значения физически хранятся в массиве в порядке FIFO.

Как уже упоминалось, они устаревшие классы, и вы не должны использовать их, например, Javadoc из Stack говорит:

Более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализации, которые следует использовать в предпочтении этому классу.

Javadoc из Deque говорит:

могут также двусторонние очереди можно использовать в качестве LIFO (Last-In-First-Out) стеки. Этот интерфейс следует использовать в предпочтении унаследованному классу Stack. Когда deque используется как стек, элементы выталкиваются и выталкиваются из начала deque.

Таким образом, итерация в Deque будет видеть элементы в LIFO порядке, в то время как итерация в Stack будет видеть элементы в порядке их поступления. Тем не менее, оба работают правильно, как стек.

-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()); 
} 
Смежные вопросы