Java集合(LIFO结构)

时间:2008-11-19 16:21:52

标签: java collections stack queue

我在Java的Collections框架中寻找LIFO Structure(Stack)但没有任何成功。基本上我想要一个非常简单的堆栈;我完美的选择是Deque,但我是Java 1.5。

我不想在我的结构中添加另一个类,但我想知道是否可能:

  1. Collections框架(1.5)中是否有任何类可以完成这项工作?

  2. 如果没有,有没有办法在没有重新实现的情况下在LIFO队列(又称堆栈)中转换队列?

  3. 如果没有,我应该为此任务扩展哪个接口或类?我想保持Sun公司与Deque公司合作的方式是一个良好的开端。

  4. 非常感谢。

    编辑:我忘了谈论Stack类:当我看到它实现了Vector类时,我对这个类有疑问,而Vector类有点过时了,不是吗?

7 个答案:

答案 0 :(得分:52)

实际上有一个Stack类:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Stack.html

如果您不想使用它,则LinkedList类(http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html)具有addFirstaddLast以及removeFirstremoveLast方法,它非常适合用作堆栈或队列类。

答案 1 :(得分:8)

堆栈类缓慢:方法同步+ Stac k扩展同步向量

答案 2 :(得分:8)

我意识到我在这里迟到了,但java.util.Collections(Java 7)有一个静态的'asLifoQueue',它接受一个Deque参数并返回(显然)deque的LIFO队列视图。我不确定添加了什么版本。

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#asLifoQueue(java.util.Deque)

答案 3 :(得分:6)

有一个Stack class in the API。这会满足你的需求吗?

答案 4 :(得分:6)

虽然前一段时间提出这个问题但提供一个JDK6 +答案可能是明智之举,该答案现在提供Deque(甲板)接口,该接口由ArrayDeque数据结构和{{3}实现已更新以实现此接口。同时访问的专用表单也存在,由LinkedListConcurrentLinkedDeque实现。

deque的一个好处是它提供了LIFO(堆栈)和FIFO(队列)支持,它可能会导致混淆哪些方法用于队列操作,哪些方法用于新手的堆栈操作。

恕我直言,JDK应该有Stack接口和Queue接口,仍然可以由LinkedBlockingDeque之类的接口实现,但只暴露该结构所需的方法子集,即LIFO可以定义pop()push()peek(),然后在

的上下文中
LIFO<String> stack = new ArrayDeque<>();

只会暴露堆栈操作,以阻止有人在ArrayDeque出现意外时调用add(E)

答案 5 :(得分:0)

为了完整起见,我提供了一个Dequeue和一个纯链接列表示例。

将Dequeue接口与LinkedList结合使用(推荐):

    Deque<String> dequeue = new LinkedList<>();
    dequeue.add("first");
    dequeue.add("last");

    // returns "last" without removing it
    System.out.println(dequeue.peekLast());

    // removes and returns "last"
    System.out.println(dequeue.pollLast());

通过LinkedList备份Dequeue非常适合性能,因为从中插入和删除元素是在恒定时间内完成的(O(1))。

单独使用LinkedList:

    LinkedList<String> list = new LinkedList<>();
    list.add("first");
    list.add("last");

    // returns "last" without removing it
    System.out.println(list.getLast());

    // removes and returns "last"
    System.out.println(list.removeLast());

答案 6 :(得分:-2)

[错误的表现 - 明智] 我只是让人们知道这不是一个好的解决方案。

最简单的答案是使用ArrayList,只需在0索引处添加对象。

List<String> arrayList = new ArrayList<>();
arrayList.add(0, "three");
arrayList.add(0, "two");
arrayList.add(0, "one");

// Prints: [one, two, three]
System.out.println(arrayList);

在0索引处添加对象将添加到列表的顶部,并移动列表的其余部分。现在您有一个简单的LIFO数据结构。

编辑:使用LinkedList比使用ArrayList更快。所以使用LinkedList.addFirst()更好。