0

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.

1 Answer 1

2

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).

Sign up to request clarification or add additional context in comments.

1 Comment

Fixed it! Thank you so much - now I can continue with my work. I was stuck with it for 3 hours :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.