java - Java中的栈和动态数组实现

标签 java

我需要使用我必须自己创建的动态数组来实现堆栈数组。

这是我的动态数组:

import java.util.Arrays;

public class Array {
public int[] dynArray; 
int counter = 0;  

public void create(int n) {
    dynArray = new int[n]; 
}


public void doubleSize() {
    int currentSize = dynArray.length; 
    int newSize = currentSize*2; 
    dynArray = Arrays.copyOf(dynArray, newSize);    
}


private void halfSize() {
    int currentSize = dynArray.length; 
    int newSize = currentSize/2;    
    dynArray = Arrays.copyOf(dynArray, newSize);
}

public void add(int x) {
    dynArray[counter] = x; 
    counter++; 

    float ratio = (float) counter / (float) dynArray.length;
    if (ratio == 1) {
        doubleSize(); 
    }
}

public int rem() {
    int last = dynArray[counter-1]; 
    dynArray[counter-1] = 0; 
    counter--; 


    float ratio = (float) counter / (float) dynArray.length;
    if (ratio <= 0.25) {
        halfSize();
    }
    return last;
}

public int get(int i) {

    if(!(check(i))) {
        //System.out.print("Cannot be added");
        return i;
    }
    else return dynArray[i]; 
}


public void put(int x, int y) {

    float ratio = (float) counter / (float) dynArray.length;
    if (ratio ==1) {
        doubleSize(); 
    }
    if(!check(y)) {
        System.out.println("No such index, nothing added to "+y);
    } else {
        dynArray[y] = x; 
    }
}

public int len() {
    return dynArray.length;
}


public boolean check(int index) {
    if(index <0 || index >=dynArray.length) {
        return false;
    } else {
        return true;
    }
}

public static void main(String[] args) {
    Array dm = new Array();
    dm.create(5);
    System.out.println("Current array length "+dm.len());
    dm.add(5);
    dm.add(4);
    dm.add(3);
    dm.add(1);
    dm.add(2);
    System.out.println("Current array length "+dm.len());
    dm.rem();
    dm.rem();
    System.out.println("Current array length "+dm.len());
    dm.rem();
    System.out.println("Current array length "+dm.len());
    dm.rem();
    System.out.println("Current array length "+dm.len());
 }
 }

这是我的堆栈代码:

public class Stack {
private static Array a;

public void create() {
    a = new Array();
}


void push(int x) {
    a.add(x);
}


int pop() {
    return a.rem();
}


boolean isEmpty() {
    return a.len() == 0;
}

public static void main(String[] args) {
    Stack stack = new Stack();
    stack.create();
    stack.push(1);
    /*int k = 1;
    stack.push(2*k);
    stack.push(2*k+1);
    stack.push(2*k+2);

    for (int i = 0; i<40; i++) {
        System.out.println(stack.pop());
    }*/

}
}

当我在 Stack.java main 中编写 stack.push(1) 时,它会在它显示的行上给出一个 NullPointerException a.add(x)。我不明白为什么会出现这个异常。

最佳答案

Stack 中的 create 方法创建一个新的 Array 实例,但不会调用 Array 的 create 方法。因此,dynArray 保持为 null,并且在访问它时会收到 NullPointerException(在 dynArray[counter] = x; 中)。

您可能应该在 Array 的构造函数中调用 create (或者消除 create 方法并将其代码移至构造函数)。

关于java - Java中的栈和动态数组实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733850/

相关文章:

java - 如何在 Java 中使用双位代码和 doubleToLongBits()?

java - 关于 while 循环的问题以及如何重新提出 y/n 问题

java - JFreeChart - 时间序列和 CandleStick 在同一图表上

java - Facebook4j 分页获取所有好友

java - 如何使我的 NetBeans 项目更加可移植?

Java 非常大的堆大小

java - Eclipse - 在 Java 透视图中禁用 XML 文件的编译

java - 将类的 ArrayList 从 jsp 传递到 servlet

java - itext 在 PDF 中嵌入字体

java - 使用Java SDK,如何在Azure存储文件服务中设置文件的元数据?