我在Java中实现了一个非常基本的堆栈,它给出了以前从未遇到过的奇怪错误。代码如下:
public class Stack {
Node top;
int size;
public Stack() {top=null; size=0;}
public int pop() {
if(top!=null) {
int item = top.data;
top = top.next;
size--;
return item;
}
return -1;
}
public void push(int data) {
Node t = new Node(data);
t.next = this.top;
this.top = t;
size++;
}
public boolean isEmpty() {
return size<=0 ;
}
public int getSize() {
return size;
}
public int peek() {
return top.data;
}
public void printStack() {
Node n = this.top;
int pos = this.getSize();
while(pos>=0) {
System.out.println("Position: " + pos + " Element: " + n.data);
if(pos>0) {
n = n.next;
}
pos--;
}
}
}
class Node {
public int data;
public Node next;
Node(int d) {data=d; next=null;}
public int getData() {return data;}
}
class Tester {
public static void main(String[] args) {
Stack s = new Stack();
s.push(9);s.push(2);s.push(7);s.push(3);s.push(6);s.push(4);s.push(5);
System.out.println("Size is: " + s.getSize());
//s.printStack();
for (int i=0; i<s.getSize(); i++) {
System.out.print(s.pop()+ " ");
}
System.out.println();
}
}
我已经进行了彻底的测试,发现推送操作可以完美地工作,所有 7 个元素都以正确的顺序推送,并设置了正确的下一个/顶部指针。但是,当我尝试弹出所有元素时,只有它会弹出前 4 名 (5-4-6-3),留下其他元素。然后,我尝试使用上述方法执行printStack,它给出了随机的NullPointerException错误,如下所示:
run:
Position: 7 Element: 5
Position: 6 Element: 4
Position: 5 Element: 6
Position: 4 Element: 3
Exception in thread "main" java.lang.NullPointerException
Position: 3 Element: 7
Position: 2 Element: 2
at Stack.printStack(Stack.java:58)
Position: 1 Element: 9
at Tester.main(Stack.java:95)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
这些错误对我来说没有意义,此外,通过在 push() 和 printStack() 中引入更多打印语句进行跟踪,它开始抛出更多随机异常。对于每次运行,错误是完全不确定的,并且在不同的机器中给出不同的模式。我已经跟踪了使用 Netbeans 调试器的完整运行,没有发现任何错误!
非常感谢您的帮助!谢谢!
printStack()
方法中的第一个:
while (pos > 0) {
而不是
while (pos >= 0) {
因为你的0位置总是null
主要:
int size = s.getSize();
for (int i = 0; i < size; i++)
而不是
for (int i = 0; i < s.getSize(); i++)
因为您的堆栈大小会随着每次迭代而减小。
for (int i=0; i<s.getSize(); i++)
导致每次 POP 的堆栈大小减小,我将为每个 POP 增加。当它完成 4 次弹出时,堆栈大小等于 i 的值。因此,打印堆栈在中间停止。
将上面的 for 循环替换为以下内容
for (; !s.isEmpty();)
将解决问题。
printStack() 失败,因为您没有检查 n 是否为空。以下代码可解决此问题。
'public void printStack() { 节点 n = this.top; int pos = this.getSize();
System.out.println("Stack Size is " + pos);
while(n!=null) {
System.out.println("Position: " + pos + " Element: " + n.data);
n = n.next;
pos--;
}
}`