如何显示LIFO堆栈的内容而不删除Java中的内容?

时间:2020-02-09 23:05:23

标签: java stack lifo

我正在尝试创建一种遵循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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

如果您可以自由使用任何Java类,那么可以使用Deque代替Stack? iterator()和DescendingIterator()方法将完成您的工作。

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

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

答案 2 :(得分:0)

如果您想反顺序,只需执行

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