1

我正在尝试创建一种遵循 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();,因为如果我没记错的话,那会删除堆栈中的数据。

我怎样才能做到这一点?

提前致谢。

4

3 回答 3

1

为此,您需要创建一个辅助堆栈,它可以临时保存弹出的项目:

Stack<String> temp = new Stack<>();
while(!history.isEmpty()){
    System.out.println(history.peek());
    temp.push(history.pop);
}
while(!temp.isEmtpy){
    history.push(temp.pop);
}
于 2020-02-09T23:18:57.003 回答
1

如果您可以自由使用任何 Java 类,您可以使用 Deque 而不是 Stack?iterator() 和 descendingIterator() 方法可以完成您的工作。

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

来自 Stack 文档:Deque 接口及其实现提供了一组更完整和一致的 LIFO 堆栈操作,应优先使用此类。

于 2020-02-10T00:45:50.243 回答
0

如果你想要相反的顺序,就这样做

for (ListIterator  i = history.listIterator(history.size()); i.hasPrevious();) {
    System.out.println(i.previous());
}
于 2020-02-09T23:48:07.290 回答