我已经工作了几个小时,现在试图获得一个基于构建和实现的数组的堆栈。我检查了几个源,看起来我的ArrayStack类构造正确。但是,当我运行debug时,'head'保持null和size& sp回到0:因此,实际上没有任何东西被推到堆栈上。有人可以帮我理解我的错误实施吗?
这是我的ArrayStack类:
public class ArrayStack <T>{
protected int sp; //empty stack
protected T[] head; //array
private int size;
@SuppressWarnings("unchecked")
public void stack(T t){
sp = -1;
size = 24; //sets the default size of the stack
head = (T[]) new Object [size];
}
public boolean isFull(){
return sp == -1;
}
public void push (T t){
if (!isFull())
head[++sp] = t;
}
public T pop (){
if (isFull()){
return null;
}
else
return head[sp--]; //LINE 30
}
}
这是我的主要方法:
public class StacksAndQsMain {
public static void main(String[] args) {
//Array Implementation
ArrayStack<String> as = new ArrayStack<String>();
String s = "Hello";
String s1 = "World";
String s2 = "Again";
as.push(s);
as.push(s1);
as.push(s2);
System.out.println (as.pop()); //LINE 15
System.out.println();
System.out.println (as.pop());
System.out.println();
System.out.println (as.pop());
System.out.println();
}
}
最后,这是我的堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
at stackAndQs.ArrayStack.pop(ArrayStack.java:30)
at stackAndQs.StacksAndQsMain.main(StacksAndQsMain.java:15)
我的变量在public void push(T t)
this ArrayStack<T> (id=17)
head null
size 0
sp 0
t "Hello" (id=18)
答案 0 :(得分:2)
您正在使用该类的默认构造函数,它将所有数据成员初始化为其默认值:
public class ArrayStack <T>{
protected int sp; //empty stack <-- initialized to 0
protected T[] head; //array <-- initialized to null
private int size; // <-- initialized to 0
// ... snip
}
您需要实现默认构造函数以将此对象状态初始化为所需的默认值(在stack()方法中)。当您调用push时,isFull方法将返回false(作为默认整数值0!= -1)。
您可以在使用之前调用stack(),而不是实现默认构造函数,但是没有理由让您的对象在陷阱陷阱状态下构建!
此外,你的isFull方法应该针对size变量检查sp,现在它的行为是一个isEmpty检查: - )
答案 1 :(得分:1)
您没有使用任何自定义构造函数。您正在使用默认值,导致sp
变量为“0”而不是“-1”。推送后,sp
的{{1}}值为3
,但sp[3]
中没有数据,当您尝试弹出时会导致NPE。
将stack
方法更改为
public ArrayStack(T t){
sp = -1;
size = 24; //sets the default size of the stack
head = (T[]) new Object [size];
}
使其成为自定义构造函数。
答案 2 :(得分:1)
我注意到了两件事。
首先,正如其他人所说,你需要创建一个构造函数并初始化数组。其次,isFull
方法应该检查sp!= this.size -1,基本上确保你不在堆栈实现的24元素限制。更改后,isFull
你应该在push方法中否定if条件以检查堆栈是否已满。另外,我会删除对pop
方法的检查以检查堆栈isFull
,为什么会阻止某人因为堆栈已满而弹出一个元素?而是检查堆栈是否为空。
public class ArrayStack<T> {
protected int sp; // empty stack
protected T[] head; // array
private int size;
@SuppressWarnings("unchecked")
public ArrayStack() {
sp = -1;
size = 24; // sets the default size of the stack
head = (T[]) new Object[size];
}
public boolean isFull() {
return sp == this.size -1;
}
public boolean isEmpty() {
return sp == -1;
}
public void push(T t) {
if (!isFull())
head[++sp] = t;
}
public T pop() {
if (isEmpty()) {
return null;
} else
return head[sp--]; // LINE 30
}
public static void main(String[] args) {
// Array Implementation
ArrayStack<String> as = new ArrayStack<String>();
String s = "Hello";
String s1 = "World";
String s2 = "Again";
as.push(s);
as.push(s1);
as.push(s2);
System.out.println(as.pop()); // LINE 15
System.out.println();
System.out.println(as.pop());
System.out.println();
System.out.println(as.pop());
System.out.println();
}
}
答案 3 :(得分:0)
按“Hello”(第1个对象)后, sp 变为 0 ,并分配了head [0]。从这一刻起,所有进一步的“推动”都不会产生任何结果,因为你的IsFull仍在测试(sp == -1)。