0
The student at the top of the stack is Gullion,Hailey

Student Mcglothlen,Shizue is removed from the stack


Here are all the elements of the Stack using an Iterator
--------------------------------------------------------
Stack$Node@3012db7c
Stack$Node@2607c28c
Stack$Node@477588d5
Stack$Node@756a7c99
Stack$Node@221a5d08
Stack$Node@70d1c9b5
Stack$Node@5d11c3f0
Stack$Node@3956f14c
Stack$Node@7afbd1fc
null


Here are all the elements in the Stack
--------------------------------------
Putney,John
Larkey,Ismael
Winkler,Isiah
Aceto,Liana
Hamill,Crissy
Caraway,Elmira
Gullion,Hailey
Rodrigez,Jonie
Madruga,Terrell
Williams,Diego

Iterator を使用した Stack の要素の最初のリストは明らかに機能していません。何故かはわからない。Stack クラスの Iterator のコードは次のとおりです。

public Iterator<Student> iterator()  { return new ListIterator();  }

// an iterator, doesn't implement remove() since it's optional
private class ListIterator implements Iterator<Student> {
    private Node<Student> current = top;

    public boolean hasNext()  { 
        return current != null;                     
    }

    public void remove() { 
        throw new UnsupportedOperationException();  


    @SuppressWarnings("unchecked")
    public Student next() {
        if (!hasNext()) throw new NoSuchElementException();
        current = current.next; 
       return (Student)current;
    }
}

これは、問題があると思われる Driver クラスのコードです。

System.out.println("\nHere are all the elements of the Stack using an Iterator");
  System.out.println("--------------------------------------------------------");
  Iterator <Student> iter = myStack.iterator();
  while (iter.hasNext() )
      System.out.println(iter.next() );

すべてのクラスは次のとおりです。

スタック: http://pastebin.com/2HVLVHuM

キュークラス: http://pastebin.com/3q537kHW

学生クラス: http://pastebin.com/UnBB7kPA

ドライバークラス: http://pastebin.com/yeA34MNd

STACK クラスでしかコードを記述できません。これのポイントは、キューを使用してスタックを実装することでした。お役に立てれば

4

4 に答える 4

2

まず第一に、あなたのnext()メソッドの間違ったキャストに対する nneonneo の答えを見てください。

次に、Iterator の実装が正しくありません。

next()イテレータの関数は、要素currentを に設定した後に要素を返しますcurrent.next

next()反復の最後の要素を呼び出した後、 hasNext()false を返す必要があります。currentしかし、返されたばかりの要素をまだ指しているため、そうではありません。だからまた電話next()する。そして、このメソッドでは、current = current.nextに設定currentnull、それを返します。hasNext が true だったので、どちらが起こるべきではありませんか?

同じ理由で、スタックの最初の要素がありません: スタックcurrentの一番上の要素に設定しましたが、何かを出力する前に、既に に切り替えていcurrent = current.nextます。出力を行った後にそれを行う必要があります。

于 2012-10-19T02:04:47.783 に答える
2

toString()クラスにメソッドを追加する必要がありますStudent。Iterator は正しく動作していますが、System.out.println()は を表示する方法を知りませんStudent

Studentこのようなクラスに何かを追加します...

public String toString(){
    return name;
}

を呼び出すとSystem.out.println()、実際の値を出力できるようになります。を呼び出すとSystem.out.println(Object)、常に値を出力しようとしtoString()ます。このメソッドが定義されていない場合、表示されているオブジェクトの Java ID が出力されます。

于 2012-10-19T01:55:10.963 に答える
2

currentStackイテレータでは として定義されていますNode<Student>。キャストを使用してメソッドcurrentから戻ります。next()

したがって、実際の の代わりに(type-cast to ) をnext()返します。おそらくメソッドがないため、デフォルトの出力 ( ) が得られます。Node<Student>StudentStudentNodetoStringStack$Node@<addr>

修正するには、代わりにcurrent.itemfromのようなものを返します ( に格納されているアイテムが と呼ばれるとnext()仮定します)。Nodeitem

于 2012-10-19T02:16:47.420 に答える
1

Iterator を使用した Stack の要素の最初のリストは明らかに機能していません。何故かはわからない。

Node<Student>イテレータが学生の代わりに a を返しているためです。問題は次の場所にあります。

return (Student)current;

おそらくこれを実行しようとしましたが、互換性のない型エラーが発生しました:

return current;

それで、キャストして修正しようとしました。問題は、ノードが学生ではないことです。ノードには生徒が含まれています。ノードに含まれる学生を返す必要があります。

これを試して:

    return current.data;

type の current を宣言したため、コンパイラは node の「データ」メンバーが Student であることを認識しているため、キャストは必要ありませんNode<Student>。これにより、生徒が間違って印刷する問題が修正されます。ただし、@Konstantin で指摘されているように、イテレータはまだ壊れています。現在の値を一時変数に保存し、現在の値を移動してから、一時変数を返す必要があります。考えられる実装の 1 つを次に示します。

    public Student next() {
        if (current == null) throw new NoSuchElementException();
        Node<Student> result = current;
        current = current.next;
        return result.data;
    }

[エピローグ]

ジェネリックのチュートリアルを確認する必要があります。上記で貼り付けたコードからは明らかではありませんが、型パラメーターとして Student を使用していることはペースト ビン コードで明らかです。これは非常に非標準的で混乱を招きます。慣例では、大文字を使用します。通常は T です。次のようにスタックを宣言する必要があります。Student を使用する場合は、T に置き換えてください。

public class Stack <T> implements Iterable<T>{   // good

それ以外の

public class Stack <Student> implements Iterable<Student>{ // bad

T は、後で決定されるタイプを意味し、あらゆる種類のオブジェクトで Stack を使用できます。実際にスタックを作成して Student (または何でも) を使用する場合のみ

public static void main(String [] args)
{
    Stack<Student> x = new Stack<Student>();
于 2012-10-19T03:26:19.210 に答える