2014-11-04 3 views
0

Мне нужно реализовать массив стека с использованием динамического массива, который я должен был создать самостоятельно.Реализация стека и динамического массива в 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.push(1) в Stack.java основном, это дает мне NullPointerException на линии, где он говорит a.add(x). Я не понимаю, почему происходит это исключение.

ответ

1

Ваш метод создания в вашем Stack создает новый экземпляр Array, но не вызывает метод создания Array. Поэтому dynArray остается нулевым, и вы получаете NullPointerException, когда он доступен (в dynArray[counter] = x;).

В конструкторе Array вы должны позвонить create (или исключить метод create и переместить его код в конструктор).

+0

Вы так быстрее :) –

+0

Исправлено! Большое вам спасибо - теперь я могу продолжить свою работу. Я застрял с ним в течение 3 часов :) – e4n

+0

@ e4n Добро пожаловать! – Eran

Смежные вопросы