Je nach Bedarf könnten Sie entweder ArrayDeque
oder LinkedList
möchten.
Beide implementieren Deque
(double ended queue).
Aus dem Javadoc on ArrayDeque
: "Diese Klasse ist wahrscheinlich schneller als Stack, wenn sie als Stack verwendet wird, und schneller als LinkedList, wenn sie als Warteschlange verwendet wird."
Elemente können an beiden Enden eines Deque
hinzugefügt oder entfernt werden.
A Deque
kann als eine Warteschlange verwendet werden, indem addLast
und removeFirst
, aufrufen und auch durch einen Stapel verwendet werden, kann durch addLast
und removeLast
verwenden.
Wenn Sie es wirklich wie entweder eine verhalten wollen, können Sie eine boolean-Flag halten und Hilfsmethoden schreiben, oder Sie können eine Klasse schreiben:
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();
}
}
Hier ist der Test:
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"
Warum funktionieren 'java.util.Queue' und 'java.util.Stack ' nicht für Sie? –
Moira
Es muss eine einzelne Variable von Something <> sein, die entweder –