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

我只能在堆栈类中编写代码。这样做的目的是使用队列实现堆栈。希望这可以帮助

4

4 回答 4

2

首先,请参阅 nneonneo 对您next()方法中不正确的演员的回答。

其次,您的 Iterator 实现不正确。

迭代器中的next()函数将元素current设置为current.next.

在调用next()迭代的最后一个元素后,hasNext()应该返回 false。但它没有,因为current仍然指向你刚刚返回的元素。所以你会next()再打电话。在此方法中,current = current.next将设置currentnull,然后将其返回。这不应该发生,因为 hasNext 是真的,对吧?

出于同样的原因,您的堆栈的第一个元素丢失了:您设置current为堆栈的顶部元素,但在输出任何内容之前,您已经切换到current = current.next. 您应该在完成输出执行此操作。

于 2012-10-19T02:04:47.783 回答
2

你需要在你的类中添加一个toString()方法。Student迭代器工作正常,但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

current在您的Stack迭代器中定义为Node<Student>. current您使用强制转换从您的next()方法返回。

因此,next()返回一个Node<Student>(类型转换为Student),而不是实际的Student. 由于Node可能没有toString方法,因此您将获得默认输出 ( Stack$Node@<addr>)。

要修复,请返回类似current.itemfrom 的内容next()(假设存储在中的项目Node被调用item)。

于 2012-10-19T02:16:47.420 回答
1

使用 Iterator 的 Stack 的第一个元素列表显然不起作用。我不知道为什么。

因为您的迭代器返回的是 aNode<Student>而不是学生。问题出在:

return (Student)current;

您可能尝试过这样做,但遇到了不兼容的类型错误:

return current;

所以你试图通过强制转换来修复。问题是节点不是学生。一个节点包含一个学生。您需要返回节点包含的学生。

尝试这个:

    return current.data;

不需要强制转换,因为编译器知道 node 的“数据”成员是 Student,因为您声明了 current 类型Node<Student>。这将解决您的学生打印不正确的问题。但是,正如@Konstantin 所指出的,您的迭代器仍然损坏。您需要将 current 的值保存在临时变量中,移动 current,然后返回临时变量。这是一种可能的实现:

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

[结语]

您确实需要查看泛型教程。您在上面粘贴的代码中并不清楚,但在 paste-bin 代码中很明显您使用 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 回答