Stack
追加のメモリを使用せずに、上から下への要素をどのように反復処理できるか疑問に思っていました。デフォルトiterator()
は下から上に行くと思います。があることにも気づきDeque
ましたdescendingIterator
。スタックについてこれに似たものを見つけることができませんでした。私はそれが可能かどうか疑問に思っていました。特に何もありません。これが不可能な場合、Stack
逆方向に反復する機能を備えた a の機能を提供する他の Java データ構造 ( Deque
ofc を除く) はどれですか?
2 に答える
追加のメモリを使用せずに、スタックの要素を上から下にどのように反復処理できるか疑問に思っていました。
概念上、スタック は、少なくともそのすべての要素をポップすることはできません。限目。
ここでの主な問題は、このスタック データ構造を Javaと混同していることです。 Java は、そのスーパー クラスからStack
を提供しており、おそらく混乱を招きます。実際、これは Java 1 に由来する設計上の問題です。クラスの使用は推奨されません。であり、 から拡張されているため、その使用もお勧めできません。また、クラスの JavaDoc で、作成者は次の情報を追加します (私のものを強調します)。iterator
Vector
Vector
Stack
vector
Stack
Deque
インターフェースとその実装によって、より完全で一貫した LIFO スタック操作のセットが提供されます。これは、このクラスよりも優先して使用する必要があります。
があることにも気づき
Deque
ましたdescendingIterator
...
コメントで述べたように、テクノロジ (この場合は Java) がデータ構造の反復処理に役立つという事実は、良いことです (または、見方や使い方によっては悪いことです)。
Deque
は両端キューであり、使用方法に応じて、スタックとキューの両方として機能することに注意してください。
からDeque
拡張されIterable
ているため、要素のシーケンスなどの特定の動作を使用してその要素にアクセスできるようにするために を提供する必要がIterator
あります。このイテレータは、キューをナビゲートするように、最初から最後まで要素にアクセスします。descendingIterator
スタックをナビゲートするように、最後の要素から最初の要素へとアクセスするイテレータを返します。ただし、これはテクノロジの利点であることを考慮してください。
これが不可能な場合、逆方向に反復する機能を備えたスタックの機能を提供する他の Java データ構造 (
Deque
ofc を除く) はどれですか?
並行する子である を除けばBlockingDeque
、共通の Java インターフェイスにはないように見えます。これは、この設計によって推進されています。「インターフェイスにプログラムする」とはどういう意味ですか? . または別の構造を使用して最初からスタックを作成したり、スタックArrayList
のように動作させたりすることができますが、それでもあなた次第であることに注意してください。