2016-10-09 15 views
1

スタックはLIFO順序に従うデータ構造です。私の知る限り、スタックはトップ要素にのみアクセスできます。しかし、Javaでは、スタックを持つイテレータを使用することができます。これは、上の要素だけにアクセスできるという上記の考え方に何らかの形で矛盾しています。Javaのスタックでイテレータを使用することはどのように正当化されますか

サンプルコード

Stack<Integer> s=new Stack<Integer>(); 
    s.push(10); 
    s.push(20); 
    s.push(30); 
    ------------------------------------------------------------------------ 
    Iterator<Integer> itr=s.iterator(); 
    while(itr.hasNext()) 
    { 
     System.out.print(itr.next() + " "); // ouput:- 10 20 30 
    } 

私は、FIFO順でスタックをトラバースすることができますし、私も

はそれは非常にですitr.removeを()を使用して、任意の要素を削除することができ、スタック上のイテレータを持っています混乱:)

...

PSを説明してください:場合、私は場所0で反復子を使用しますf iteratorの場合は、前者の方がより多くのメソッドを提供するため、さらに混乱します。

+2

「トップ要素のみ」は間違っています。スタックは、通常、トップに関連する要素、トップ1、トップ2などにアクセスすることを可能にします。イテレータは、同じ方法ですべての要素を通過することができます。 – markspace

+2

おそらく、非常にメソッドがスレッドセーフである場合は、スタックをベクタにして使用しないでください。 – SMA

+1

これは '純粋な'理論的スタックと少し違っていて、ほとんどの場合、これを使わない(スタックの出力とデバッグを除いて)が便利です:) stackの定義はpush、ポップ、トップ ' – okaram

答えて

3

Java Stack<T>は、abstract stack data typeより多くの操作を提供します。ほとんどの場合、これは歴史的な理由から行われます。StackはJava 1.0の一部であり、そのデザイナーはVectorから派生することにしました。これはVectorの操作がStackの操作になった方法です。パブリッククラスに追加のパブリックオペレーションを許可すると、それらを取り戻す方法はありません。

これは、クラスが何らかの形で破損していることを意味するものではありません。Vector<T>によって提供される追加の操作を望まない場合は、コード内で使用しないでください。

+1

[Deque](http://docs.oracle.com/javase/8/docs/api/java/util/Deque.html)に切り替えると同じことが言えます。[javadoc]( http://docs.oracle.com/javase/8/docs/api/java/util/Stack.html)を参照してください。 'Stack'がまだクラスでなければ、' push'、 'pop()'、 'peek()'メソッドだけで 'Stack'インターフェースを追加した可能性が非常に高いでしょう。 – Andreas

関連する問題