尝试在Java中实现Array Stack但Push不起作用

时间:2013-03-14 00:31:23

标签: java arrays stack

我已经工作了几个小时,现在试图获得一个基于构建和实现的数组的堆栈。我检查了几个源,看起来我的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)

4 个答案:

答案 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)。