如何创建可以存储队列或堆栈的变量?

时间:2017-02-19 17:43:41

标签: java interface

我有一个对象,它有一个我希望能够保存队列或堆栈的变量。任何具有适当逻辑的添加和删除的东西。我认为这可以通过一个接口完成,但java.util中的两个没有相同的接口,甚至两个操作的名称相同。

我现在的计划是创建一个包装器,使它们符合我的要求,但这似乎不够优雅。还有更好的方法吗?

我想要类似的东西:

Something<E> steps;

这样我就可以调用step.pop()和step.push()或任何方法名称,而不必知道步骤是实现队列逻辑还是堆栈逻辑。

1 个答案:

答案 0 :(得分:5)

根据您的需要,您可能需要ArrayDequeLinkedList

两者都实现Deque(双端队列)。

来自ArrayDeque上的Javadoc:“当用作堆栈时,此类可能比Stack快,并且当用作队列时比LinkedList更快。”

可以在Deque的任意一端添加或删除元素。

Deque可以通过调用addLastremoveFirst用作队列,也可以通过addLastremoveLast使用堆栈来使用public class QueueOrStack<E> implements Iterable<E> { private Deque<E> container = new ArrayDeque<E>(); private boolean isQueue; public QueueOrStack(boolean isQueue) { this.isQueue = isQueue; } public E pop() { return isQueue ? container.removeFirst() : container.removeLast(); } public void push(E element) { container.addLast(element); } public void pushAll(E... element) { for (E e : element) container.addLast(e); } public boolean isQueue() { return isQueue; } public void setQueue(boolean isQueue) { this.isQueue = isQueue; } public boolean toggleQueue() { return isQueue = !isQueue; } @Override public Iterator<E> iterator() { return container.iterator(); } }

如果你真的希望它表现得像任何一个,你可以保留一个布尔标志并编写辅助方法,或者你可以编写一个类:

QueueOrStack<String> strings = new QueueOrStack<>(true);
strings.pushAll("hello", ", " , "world\n");
for(String s : strings)
    System.out.print(s); //"hello, world"
System.out.println(strings.pop()); //"hello"
strings.toggleQueue();
System.out.println(strings.pop()); //"world"

以下是测试:

{{1}}