为什么我在Java代码中获得此输出?

时间:2012-10-19 01:52:27

标签: java stack queue implementation

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 个答案:

答案 0 :(得分:2)

您需要在toString()课程中添加Student方法。迭代器工作正常,但System.out.println()不知道如何显示Student

像这样向Student类添加内容......

public String toString(){
    return name;
}

因此,当您致电System.out.println()时,它可以输出实际值。当您致电System.out.println(Object)时,它始终会尝试输出toString()值。如果未定义此方法,它将输出对象的java ID,这就是您所看到的。

答案 1 :(得分:2)

首先,请参阅nneonneo对next()方法中错误演员的回答。

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

迭代器中的next()函数在将其设置为current后返回元素current.next

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

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

答案 2 :(得分:2)

current迭代器中的

Stack定义为Node<Student>。您可以使用强制转换从current方法返回next()

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

要修复此问题,请从current.item返回next()之类的内容(假设Node中存储的项目称为item)。

答案 3 :(得分:1)

  

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

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

return (Student)current;

你可能试过这样做,但得到了一个不兼容的类型错误:

return current;

所以你试图通过施法来修复。问题是节点不是学生。节点包含学生。您需要返回该节点包含的学生。

试试这个:

    return current.data;

不需要强制转换,因为编译器知道节点的“data”成员是Student,因为您声明了类型为Node<Student>的当前状态。这将解决学生打印错误的问题。但正如@Konstantin指出的那样,你的迭代器仍然被打破。您需要在临时变量中保存当前值,移动当前值,然后返回临时变量。这是一个可能的实现:

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

[结语

您确实需要查看generics tutorial。从上面粘贴的代码中不清楚,但在粘贴框代码中很明显,您使用Student作为类型参数。这是非常不标准和令人困惑的。惯例是使用大写字母 - 通常是T.你应该像下面那样声明堆栈。你使用学生的任何地方,用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>();