从堆栈中获取前5个数据

时间:2011-08-25 05:32:50

标签: java data-structures stack

我使用java堆栈数据结构来维护数据。我已将我的堆栈限制为大小50.我想要做的是从一次调用中获取堆栈中的最新5个数据。我认为方法子列表(0,5)会这样做。但不幸的是,方法返回最后5个数据,因为继承自java.util.list的方法有任何方法可以做到这一点。或者是否有其他数据结构满足我的要求。请帮助我。提前谢谢。

P.s我想在我重新开始后在堆栈中保留5个数据。

 Stack stack = new Stack();
        for(int i=0; i<10;i++){
            stack.push(""+i);
        }
        for(int k= 0 ;k<11;k++){
            System.out.println(stack.subList(0,5));
        }

输出这个将是{0,1,2,3,4}。但我想得到{9,8,7,6,5}

3 个答案:

答案 0 :(得分:3)

默认堆栈实现没有您需要的方法。 你将不得不pop()你的堆栈5次。

所以我建议扩展一个Stack实现或编写一个实用方法,将5个pops分组。

类似的东西:

public static <T> List<T> multiPop( Stack<T> stack, int times)
  {
    List<T> list = new ArrayList<T>();
    for ( int i = 0;i<times;i++)
      {
      list.add(stack.pop());
      }
    return list;
  }

但需要考虑每个流行音乐的行为

如果您需要多层次

 public static <T> List<T> multiPeek( Stack<T> stack, int depth )
  {
    int len = stack.size();
    if ( len < depth )
      throw new EmptyStackException();
    List<T> list = new ArrayList<T>();
    for (int i = 0; i < depth; i++)
      {
      list.add(stack.elementAt(len-i-1));
      }
    return list;
  }

答案 1 :(得分:2)

如果sublist(0,5)返回错误的堆栈末尾,请尝试更改索引。不是从0开始,而是从stack.size()-6开始。

正如其他人所指出,你也可以pop() 5次。在函数式语言中,您正在寻找的操作简称为take 5。它很容易自己实现,但你必须用Java派生自己的堆栈类。

另一个要点:当你pop() 5次时,这些元素将从堆栈中删除。这可能是也可能不是你想要的。但是,请记住,sublist将返回一个可能修改堆栈本身的列表,因此您可以轻松地在那里遇到完整性问题。

因此,我建议您编写自己的堆栈类并实现take(n)方法,该方法执行sublist调用并将结果复制到新的列表中,这样最终返回的列表不会影响您的原始列表叠加。

答案 2 :(得分:0)

通常如果你有一个实际的堆栈,你会有一个pop方法。堆栈不完全是直接列表。你可以弹出5次,但你需要确保有东西可以从堆栈中取出。