La création de push et pop méthodes à l'intérieur d'un utilisateur défini LinkedList
Récemment, ma classe a été l'étude de ArrayLists et LinkedLists. La semaine dernière nous avons reçu une mission qui nous a demandé de créer push et pop méthodes au sein de notre LinkedList classe de pile. Je comprends la logique derrière les piles tel qu'il est last-in-first-out, mais j'ai de la difficulté avec le code réel. Je suis assez nouveau à l'informatique (ce qui est mon deuxième cours jamais) et ce travail particulier est littéralement en me faisant tirer mes cheveux. J'ai déjà fait cette mission, mais nous avons une mi-parcours de la semaine prochaine et je voudrais faire du bien. J'ai été sur le web et mon manuel à la recherche de l'aide, mais rien. Mon professeur ne se réfère qu'à moi de la TA et de la TA est le seul souci de m'aider avec la logique, pas le code. Je vais poster les instructions de mon professeur m'a donné ci-dessous, ainsi que mon code jusqu'à présent. Merci à l'avance.
Du professeur:
Mettre en œuvre les piles en utilisant le modèle donné dans la suite de Java
fichiers:
CS401StackInterface.java CS401StackLinkedListImpl.java
public interface CS401StackInterface<E>
{
/**
* Get the top element on the stack.
*
* @return the first element on the stack.
*/
public E pop();
/**
* Adds an element on the top of the stack.
*
* @param e - The element to be added to the stack.
*/
public void push(E e);
/**
* Determines the number of elements in this data structure.
*
* @return the number of elements currently resident in this
* data structure.
*/
public int size();
}
Ici est la classe où je tente de définir mes méthodes:
public class CS401StackLinkedListImpl<E> implements CS401StackInterface<E>
{
private LinkEntry<E> head;
private int num_elements;
public CS401StackLinkedListImpl()
{
head = null;
num_elements = 0;
}
public void setElement(LinkEntry<E> anElement){
head = anElement;
}
/*Append the new element to the end of the list*/
public void push(E e)
{
LinkEntry<E> temp = new LinkEntry<E>();
temp.element = e;
temp.next = head;
head = temp;
}
/*Remove the most recently pushed element at the end of the list*/
public E pop()
{
head.next = head;
num_elements--;
return (E) head;
}
public int size()
{
LinkEntry<E> temp = new LinkEntry<E>();
for (temp = head; head != null; head = head.next)
num_elements++;
return num_elements;
}
public String toString()
{
String string = "";
LinkEntry<E> temp = new LinkEntry<E>();
for (temp = head; temp != null; temp = temp.next)
{
string += temp.element.toString() + "";
}
return string;
}
/* ------------------------------------------------------------------- */
/* Inner classes */
protected class LinkEntry<E>
{
protected E element;
protected LinkEntry<E> next;
protected LinkEntry() { element = null; next = null; }
}
}
Enfin, ici, c'est ma classe principale où je test mes méthodes:
import java.util.*;
public class App {
public static <E> void main(String[] args) {
CS401StackLinkedListImpl<String> my_stack = new CS401StackLinkedListImpl<String>();
my_stack.push("Brian");
my_stack.push("Chris");
my_stack.push("Joe");
System.out.println("Stack size: " + my_stack.size());
my_stack.pop();
System.out.println("Stack size: " + my_stack.size());
my_stack.toString();
}
}
Quand je lance ma classe principale c'est de quoi il en retourne:
Stack size: 3
Exception in thread "main" java.lang.NullPointerException
at week6.CS401StackLinkedListImpl.pop(CS401StackLinkedListImpl.java:30)
at week6.App.main(App.java:66)
Tout ce que j'ai rencontré m'a juste dit de créer une nouvelle Pile, ce qui est facile, car alors je n'ai pas à vous soucier de les "entrailles" du code, mais ce n'est pas ce dont j'ai besoin. Merci.
NullPointerException
est à la ligne 30, mais vous avez collé votre extrait sans forfait ou les importations. Ligne en ligne 30?La ligne avec le menu d'appel.
Je recommande également que vous devez utiliser num_elements++ dans votre méthode push. De cette façon, vous savez toujours combien d'éléments sont dans votre pile de sorte que votre méthode de dimensionnement pouvez simplement retourner num_elements et n'ont pas à essayer de calculer.
En fait, vous allez très bien.. Si c'est votre 2ème cours..
On dirait que vous faites assez bien. Ce que l'environnement de développement que vous utilisez? Quoiqu'il en soit, je vous suggère fortement d'apprendre à utiliser tous les outils de débogage qui vous est disponible. Cela vous permettra de regarder les valeurs des variables dans votre code et vous aider à dépister les problèmes.
OriginalL'auteur Brian | 2012-10-05
Vous devez vous connecter pour publier un commentaire.
Le problème est avec votre
size
méthode. Il corrompt la valeur dehead
de sorte qu'il estnull
. Ensuite, votre appel àpop
obtient une NPE.Vous avez également un problème avec l'initialisation d'une variable -
num_elements
ne fera qu'augmenter à chaque appel àsize
. Vous pouvez simplifier ce par l'augmentation de la variable sur les appels àpush
.Également votre
setElement
corrompre votre pile, si elle est utilisée, car elle ne fait qu'head
, sans colmatage de la prochaine pointeurs.Désolé, je vois que c'est tourné dans les devoirs... donc, ici, sont quelques-uns des moyens concrets pour corriger le code:
Vous voudrez peut-être ajouter un plus vérifier à
pop
pour lancer une meilleure exception près que les NPE si il n'y a pas d'éléments, tels que:Cette réponse est à venir gentiment, j'ai donc upvoted. Un peu plus de choses: n'oubliez pas de mettre à jour num_elements dans setElement(); également envisager de renommer cette méthode pour setHead() pour être plus précis; vous pouvez également réutiliser dans push(). Tout cela si vous vous sentez toujours comme il est bon de garder cette méthode. Personnellement, je ne vois pas son utilisation.
en fait
num_elements
ne devrait pas changer danssetElement
(ousetHead
) car la taille de la pile n'est pas changé.merci pour l'aide! Ce fut ma première publication sur ce site et je ne m'attendais pas à recevoir de l'aide rapidement, je l'apprécie vraiment. Certes, j'ai avait déjà tourné dans mes devoirs, mais je me sens beaucoup mieux au sujet de mon examen la semaine prochaine maintenant.
num_elements
certainement des changements lorsquehead == null
. Elle devrait être à 1.num_elements
devrait aussi augmenter par tranche de 1 lors de l'ajout d'élémente
à la liste. Si un élémente
était déjà sur la liste, alors il est peut-être un élémente2
oùe2.next == e
et vous devriez corriger ça (e2.next = e.next
). À moins que le but de la sémantique de setElement/setHead est en retrait de la face avant de l'élément de la liste; dans ce cas,num_elements
également des changements.OriginalL'auteur Kevin Brock
Il semble ok.
Il doensn semble pas ok: vous attribuez à la
head.next
élément lui-même, ce qui crée une boucle. Ensuite, vous revenez à la réellehead
. Vous devez d'abord enregistrer la tête quelque part, puis mise à jourhead
référence à l'élément suivant et retour le précédent chef.Méthode est faux: tout d'abord, vous devez créer un élément inutile de
temp
mais vous n'en avez pas besoin (puisque vous l'utiliserez que la température à l'intérieur de la boucle et vous devez les initialiser à lahead
. Ensuite, vérifiez votre boucle for: vous utilisezhead
soit dans la condition d'arrêt soit à la fin de l'itération de boucle. Vous ne devez jamais utiliserhead
, puisque vous êtes juste une itération sur la liste et ne le modifie pas, mais justetemp
(vérifiez votretoString
code qui semble être correct).size
ne pas initialisernum_elements
donc il va juste continuer à s'accroître. Vraiment num_elements doit être incrémenté danspush
et puissize
serait alors retourner la valeur.En fait, c'est parce que
head
est utilisé danssize
qu'ils obtiennent la NPE depuishead
est corrompu après l'appel.Oui, c'est la raison, mais ma réponse était plus large, juste pour lui laisser faire la bonne chose et de comprendre pourquoi.
OriginalL'auteur Jack
regardant le code, il semble que votre méthode Pop est à l'envers.
Dans votre méthode push, vous devez affecter l'actuel tête élément de la "prochaine" attribut de la nouvelle LinkEntry, et puis assurez-vous que le nouveau chef. À cet effet, lorsque vous faites apparaître l'élément de la liste, vous devez attribuer le "prochain" de l'élément retour à l' tête de la liste. ainsi, votre code, qui est:
devrait être:
En effet, vous êtes le clonage de l' tête référence à l'élément courant en haut de la pile (de sorte que vous pouvez le retourner), puis en déplaçant la tête de référence pour pointer vers l'élément suivant dans la pile
OriginalL'auteur logical Chimp
pop
il devrait être: returnValue = (E)de la tête.élément [ou de baisse de la fonte depuiselement
est le même type]Grâce corrigé.
OriginalL'auteur Amit Deshpande