e4n
e4n

Reputation: 35

Stack and dynamic array implementation in Java

I need to implement a stack array using a dynamic array which I had to create myself.

Here's my dynamic array:

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());
 }
 }

Here's my stack code:

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());
    }*/

}
}

When I write stack.push(1) in Stack.java main, it gives me a NullPointerException on the line where it says a.add(x). I don't understand why this exception occurs.

Upvotes: 0

Views: 375

Answers (1)

Eran
Eran

Reputation: 393801

Your create method in your Stack creates a new Array instance, but doesn't call the Array's create method. Therefore dynArray remains null, and you get the NullPointerException when it's accessed (in dynArray[counter] = x;).

You should probably call create in the constructor of Array (or eliminate the create method and move its code to the constructor).

Upvotes: 2

Related Questions