我在Java的Collections框架中寻找LIFO Structure(Stack)但没有任何成功。基本上我想要一个非常简单的堆栈;我完美的选择是Deque,但我是Java 1.5。
我不想在我的结构中添加另一个类,但我想知道是否可能:
Collections框架(1.5)中是否有任何类可以完成这项工作?
如果没有,有没有办法在没有重新实现的情况下在LIFO队列(又称堆栈)中转换队列?
如果没有,我应该为此任务扩展哪个接口或类?我想保持Sun公司与Deque公司合作的方式是一个良好的开端。
非常感谢。
编辑:我忘了谈论Stack类:当我看到它实现了Vector类时,我对这个类有疑问,而Vector类有点过时了,不是吗?答案 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)具有addFirst
和addLast
以及removeFirst
和removeLast
方法,它非常适合用作堆栈或队列类。
答案 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}实现已更新以实现此接口。同时访问的专用表单也存在,由LinkedList和ConcurrentLinkedDeque实现。
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()更好。