我使用链表从头开始创建了堆栈数据结构。 push()
似乎是正确的,因为我可以通过first.data
使用显示方法,并且显示列表。但是当我使用peek()
时会得到NoSuchElementException
,因为有一个if语句if (first == null)
,但第一个不应为null
。
我不确定该如何解决。
public class StackNew implements Stack{ //Stack is an interface given by my professor
private int size;
private class Node {
public Object data;
public Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
private Node first = null;
public void push(Object newElement) {
first = new Node(newElement, first);
size++;
}
public Object peek(){
if (first == null) {
throw new NoSuchElementException();
}
return first.data;
}
public void display() {
Node previous = null;
while(first != null) {
System.out.println((first.data));
previous = first;
first = first.next;
}
}
public static void main(String args[]) {
StackNew stack = new StackNew();
stack.push("java");
stack.push(1);
stack.push("code");
stack.display();
System.out.println(stack.isEmpty());
stack.peek();
}
当我尝试使用peek()方法时,当第一个节点应包含“代码”时,该节点为null。
答案 0 :(得分:0)
在您的代码中,您会注意到只有调用display
方法时才会出现错误。
这是因为在您的实现中,您将first
覆盖为first.next
,最终在while
循环的最后一次迭代中为空。因此,您需要一个新的指针,该指针可以跟踪当前元素,并且可以前进到下一个元素,而不会影响first
指针。
因此,您需要将display
方法更正为:
public void display() {
Node current = first;
while(current != null) {
System.out.println((current.data));
current = current.next;
}
}
在这里,新的指针current
将跟踪当前元素,并且在while循环中将连续打印这些元素。
您的代码中还有其他一些问题(如果您尝试扩展java.util.Stack
):
implement
类Stack
,但实际上您应该extend
它。isEmpty()
类中的Stack
,您需要使用elementCount++;
方法而不是push()
来增加size
。当isEmpty()
检查elementCount
继承自Stack
类时。 push
的返回类型不应为void
,而应返回参数。 (根据Stack
类的Java doc)。
@Override
public Object push(Object newElement) {
first = new Node(newElement, first);
elementCount++;
return newElement;
}