2017-02-19 61 views
0

我有一個對象有一個變量,我希望能夠保持隊列或堆棧。任何有適當的邏輯添加和刪除的東西。我認爲這可以通過一個界面來完成,但是java.util中的兩個界面不具有相同的界面,或者兩個操作的界面名稱不同。如何創建一個可以存儲隊列或堆棧的變量?

我現在的計劃是創建一個包裝,使它們適合我想要的東西,但這看起來不夠雅緻。有沒有更好的辦法?

我想是這樣的:

Something<E> steps; 

所以,我可以打電話step.pop()和step.push()或任何方法的名稱,而不必知道如果步驟實現隊列邏輯或棧邏輯。

+0

爲什麼不'java.util.Queue '和'java.util.Stack '爲你工作? – Moira

+0

它必須是Something <>的一個變量,它可以存儲 –

回答

5

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

兩者都執行Deque(雙端隊列)。

來自Javadoc ArrayDeque:「當用作堆棧時,該類可能比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" 
+0

我想要某些東西步驟,我可以調用steps.pop()和step.push(),而不必考慮它是否是隊列或一個堆棧。 LinkedList似乎需要您做出選擇 –

+0

@TimothyElbert ['Queue's沒有'pop'或'push'方法](https://docs.oracle.com/javase/7/docs/api/java /util/Queue.html),但您可以編寫助手方法或單獨的類(在您的問題中提到您)。我將編輯我的答案。 – Moira

+0

@TimothyElbert編輯。 – Moira