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

Tim*_*ert 0 java interface

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

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

我想要的东西:

Something<E> steps;
Run Code Online (Sandbox Code Playgroud)

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

Moi*_*ira 5

您可能想要ArrayDeque或LinkedList根据您的需要.

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

从Javadoc开始ArrayDeque:"当用作堆栈时,此类可能比Stack更快,并且当用作队列时比LinkedList更快."

元素可以从a的任何一端添加或删除Deque.

A Deque可以通过调用addLast和作为队列removeFirst使用,也可以通过使用addLast和使用堆栈来使用removeLast.

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是测试:

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"
Run Code Online (Sandbox Code Playgroud)