2013-11-14 71 views
-2

我在想如何迭代Stack的元素,從頂部開始往下走,而不使用任何額外的內存。我相信默認iterator()從下到上。我還注意到,Deque有一個descendingIterator。我一直無法找到類似於這個堆棧的任何東西。我只是想知道是否可以做到這一點,沒有什麼特別的。如果這是不可能的,那麼其他Java數據結構提供Stack的功能並將其反向迭代(除了Deque ofc)?反轉堆棧迭代器

+3

你有什麼打算?如果你試圖這樣做,那麼你不應該使用堆棧開始。 –

+0

這似乎是一個奇怪的選擇。爲什麼在想要FIFO功能時使用FILO? – Dragondraikk

+0

如果您明白[stack](http://en.wikipedia.org/wiki/Stack_(abstract_data_type))只給出了頂部(或底部)的項目,那麼您應該已經理解了答案。這裏的人不是燃燒的,你甚至得到了答案。看起來你的問題在考慮你使用什麼結構來實現堆棧,並利用這個結構的能力解決不同的問題。如果您將結構視爲堆棧(而不是其實現),那麼這是不可能的。如果你看到的結構是一個數組或雙鏈表,那麼這是可能的。 –

回答

2

我想知道如何從頂部開始迭代堆棧的元素,並不需要使用任何額外的內存。

通過概念,一個stack不能那你彈出它的所有元素至少被重複。期。

這裏的主要問題是,您將這個堆棧數據結構與Java Stack混淆,它會爲您提供來自其超類Vectoriterator,可能會讓您感到困惑。事實上,這是一個來自Java 1的設計問題。不鼓勵使用Vector類,如下所述:Why is Java Vector class considered obsolete or deprecated?,並且因爲Stackvector延伸,所以它的使用也是不鼓勵的。此外,在Stack類的JavaDoc,作者現在添加此信息(emphasys礦):

LIFO堆棧操作的更完整,一致通過Deque接口提供和它的實現,這應該優先使用此類


我還注意到,爲Deque有一個descendingIterator ...

正如評論指出,事實上,這項技術(在這種情況下,Java的)幫助您迭代在數據結構上是好的(或壞的,取決於你如何看待/使用它)。

請注意,Deque是一個雙端隊列,可以同時用作堆棧和隊列,具體取決於您希望/需要使用它。

由於DequeIterable延伸,它應當提供的Iterator它的元素可以使用類似元素的序列中的特定行爲,這種迭代器將訪問從第一元素到最後被訪問,想通過隊列導航。 descendingIterator返回一個迭代器來訪問從上次到第一次的元素,如瀏覽堆棧。但是,再次考慮到這是技術帶來的好處。

如果這是不可能的,那麼其他Java數據結構提供堆棧的功能並且能夠向後迭代(除了Deque ofc)?

除了它的併發子,BlockingDeque,看起來不像普通的Java接口。這是由這種設計驅動的:What does it mean to "program to an interface"?。請注意,您可以使用ArrayList或其他結構從頭開始創建堆棧,或者使它像一個堆棧一樣運行,但仍然取決於您。

2

Stack是Java 1.2之前的一個非常古老的類(和Java Collections Framework)。如果可以的話,我建議你改用Deque,正如你所說,它已經具備了你所需要的全部功能。

+0

OP已經知道它似乎 – Sage

+2

@Sage OP最終問到*有什麼建議?*,這是一個有效的建議。 –

+1

@Sage OP知道'Deque',但我更加強調'Stack'是一個非常古老的類,它可能不會從Java維護者那裏獲得任何進一步的愛。就像'Vector'和'Hashtable'一樣,它的排序不鼓勵使用(即使不是官方的'@ Deprecated')。 –