Как я могу показать содержимое стека LIFO, не удаляя содержимое в Java? - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь создать функцию «истории», которая соответствует характеристикам LIFO. Последний ввод Первый вывод.

Таким образом, пользователь введет некоторые слова, которые будут сохранены в стеке для печати их после слов. В итоге программа выглядит так: функция

Stack<String> history = new Stack<>();
String word = null;

while (!word.equals(exit)) {

   word = scan.nextLine();

   if (word.equals(show)) {

      showHistory();
   } else {

     history.push(word);
   }
}

и showHistory(); имеет следующий формат:

for (String i : history) {
    System.out.println(i);
}

Проблема заключается в том, что при выполнении этой операции вывод слова, которые пользователь мог ввести, но в формате FIFO. Например, если пользователь вводит:

Карандаш

Книга

Рубашка

Вывод этой программы показывает:

Карандаш

Книга

Рубашка

Но вывод, который я хочу, после формата LIFO:

Рубашка

Книга

Карандаш

Я также не хочу удалять данные, хранящиеся в стеке, в любой точке выполнения, поэтому я не хочу не хочу использовать history.pop();, потому что, если я не ошибаюсь, это приведет к удалению данных в стеке.

Как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 10 февраля 2020

Если вы можете использовать любой класс Java, вы можете использовать Deque вместо стека? Методы iterator () и downndingIterator () выполнят вашу работу.

https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html

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

1 голос
/ 10 февраля 2020

Для этого вы должны создать вспомогательный стек, который может временно удерживать вытесненные предметы:

Stack<String> temp = new Stack<>();
while(!history.isEmpty()){
    System.out.println(history.peek());
    temp.push(history.pop);
}
while(!temp.isEmtpy){
    history.push(temp.pop);
}
0 голосов
/ 10 февраля 2020

если вы хотите в обратном порядке, просто сделайте это

for (ListIterator  i = history.listIterator(history.size()); i.hasPrevious();) {
    System.out.println(i.previous());
}
...