Versucht zu implementieren-Array-Stack in Java aber Push funktioniert nicht
Ich arbeite seit ein paar Stunden nun versucht, ein Stack basierend auf einem Array erstellt und implementiert. Ich habe mehrere Quellen, und es sieht aus wie meine Klasse ArrayStack richtig aufgebaut ist. Allerdings, wenn ich ausführen, Debuggen, 'Kopf' bleibt null und die Größe & sp zurück auf 0 gehen: also nichts ist eigentlich immer auf den stack geschoben. Kann mir jemand helfen zu verstehen, was habe ich falsch implementiert?
Hier ist meine Klasse 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
}
}
Hier ist meine Main-Methode:
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();
}
}
Schließlich, hier ist mein stack trace:
Exception in thread "main" java.lang.NullPointerException
at stackAndQs.ArrayStack.pop(ArrayStack.java:30)
at stackAndQs.StacksAndQsMain.main(StacksAndQsMain.java:15)
Meine Variablen an: public void push (T t)
this ArrayStack<T> (id=17)
head null
size 0
sp 0
t "Hello" (id=18)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bemerkte ich zwei Dinge.
Erste wie andere erwähnt haben, die Sie benötigt, um erstellen Sie einen Konstruktor und initialisieren Sie das array. Zweitens, die
isFull
Methode sollte überprüft werden, ob sp != diese.Größe -1, im Grunde macht Sie sicher, dass Ihr nicht an die 24-element Grenze Ihres stack-Implementierung. Nach dem Wechsel,isFull
sollten Sie negieren das, wenn bedingte, in der push-Methode, um zu überprüfen, dass der stack nicht voll ist. Außerdem würde ich die entfernen Sie das Häkchen auf derpop
Methode zu überprüfen, ob der stackisFull
, warum verhindern, dass jemand Sie knallen ein element nur weil der stack voll ist? Stattdessen überprüfen Sie, dass der Stapel nicht leer ist.Sind Sie mit den default-Konstruktor für die Klasse, die wird initialisiert, alle Daten, die Mitglieder auf Ihre default-Werte:
Müssen Sie implementieren die Standard-Konstruktor initialisiert dieses Objekt Zustand den Vorgaben, die Sie möchten (in dem Stapel () - Methode). Wenn Sie call drücken, wird die isFull-Methode false zurück (als Standard-integer-Wert von 0 != -1).
Statt der Implementierung einer default-Konstruktor, Sie könnten einfach anrufen stack() bevor Sie es verwenden, aber es gibt keinen Grund, lassen Sie Ihr Objekt gebaut werden booby-trapped Zustand!
Zusätzlich ist auch die Methode isFull überprüfen sollten sp mit der Größe variable, momentan ist es verhält sich wie ein isEmpty überprüfen 🙂
Du bist keine eigene Konstruktor. Bist du mit dem Standard ein, die bewirkt, dass Ihr
sp
variable '0' anstelle von '-1'. Dies führt zu einersp
Wert von3
nach Ihr an, abersp[3]
hat keine Daten, die Ergebnisse in eine NPE, wenn Sie versuchen, es pop.Ändern Sie Ihre
stack
Methodezu machen, eine eigene Konstruktor.
Nachdem Sie push "Hello" (1. Objekt) sp wird 0 und Kopf[0] zugewiesen ist. Von diesem moment alle weiteren "drückt", wird nichts produzieren, da Sie Ihre IsFull ist noch in der Testphase (sp == -1).