[Java] Liste chaînée - Pile

Liste chaînée - Pile [Java] - Java - Programmation

Marsh Posté le 08-10-2013 à 16:01:11    

Bonjour,  
 
Je suis un peu coincé sur une dernière méthode de classe de création de pile à partir d'une liste chaînée. La méthode toString me gêne un peu car j'aimerais pouvoir avoir quelque chose de la forme "[4, 3, 2, 1]", donc pouvoir remonter la pile "à rebrousse-poil" si on a empilé 1 puis 2 puis 3 puis 4.
 
J'ai commencé à faire une Stack temporaire pour pouvoir stocker le sommet de la pile, puis dépiler et à la fin reconstruire, mais je n'y parviens pas.
 
Je donne le code de la classe au quasi complet pour plus de clarté.
 

Code :
  1. public class PileListe implements PileI, Cloneable {
  2.     /** la liste des Maillons/Elements */
  3.     private Maillon stk;
  4.     /** la capacité de la pile */
  5.     private int capacite;
  6.     /** le nombre */
  7.     private int nombre;
  8.         private static class Maillon implements Cloneable {
  9.         private Object element;
  10.         private Maillon suivant;
  11.         public Maillon(Object element, Maillon suivant) {
  12.             this.element = element;
  13.             this.suivant = suivant;
  14.         }
  15.         public Maillon suivant() {
  16.             return this.suivant;
  17.         }
  18.         public Object element() {
  19.             return this.element;
  20.         }
  21.         public Object clone() throws CloneNotSupportedException {
  22.             Maillon m = (Maillon) super.clone();
  23.             m.element = element;
  24.             return m;
  25.         }
  26.     }
  27.     public PileListe(int taille) {
  28.         if (taille <= 0)
  29.             taille = CAPACITE_PAR_DEFAUT;
  30.         this.stk = null;
  31.         this.capacite = taille;
  32.     }
  33.     public PileListe() {
  34.         this(PileI.CAPACITE_PAR_DEFAUT);
  35.     }
  36.     public void empiler(Object o) throws PilePleineException {
  37.         if (estPleine())
  38.             throw new PilePleineException();
  39.         stk = new Maillon (o,stk);
  40.         nombre = nombre + 1 ;
  41.         }
  42.     public Object depiler() throws PileVideException {
  43.         if (estVide())
  44.             throw new PileVideException();
  45.         if (stk != null) {
  46.           Object o = stk.element();
  47.           stk = stk.suivant();
  48.           return o;
  49.           }
  50.           else return null;
  51.        
  52.     }
  53.     public Object sommet() throws PileVideException {
  54.         if (estVide())
  55.             throw new PileVideException();
  56.         return stk.element ;
  57.     }
  58.  
  59.     public boolean estVide() {
  60.         return stk == null ;
  61.     }
  62.       public boolean estPleine() {
  63.         return this.taille() >= capacite ;
  64.     }
  65.    // ici que ça coince     
  66.    public String toString() {
  67.         String s = "[";
  68.          Stack temp = new Stack();
  69.        while (!this.estVide()) {
  70.              temp.push(stk.element);
  71.               s = s + stk.element;
  72.               depiler();
  73.             }
  74.         return s + "]";
  75.     }
  76.     //...
  77.   }


 
Merci par avance


Message édité par roswellentongues le 08-10-2013 à 16:02:13
Reply

Marsh Posté le 08-10-2013 à 16:01:11   

Reply

Marsh Posté le 08-10-2013 à 18:50:22    

Wesh
 
J'dois etre un peu neuneu et j'ai pas d'IDE Java donc je peux pas verifier, mais c'est quoi qui marche pas dans ton code?
Si j'ai bien suivi, si tu empiles 1,2,3,4 tu vas depiler 4,3,2,1 et ta methode toString devrait renvoyer le bon resultat ([4,3,2,1]).
 
Sauf que de visu, tu inseres pas les virgules donc ca va plutot retourner [4321], ta Stack temp ne sert a rien (tu mets des trucs dedans mais tu t'en sers jamais), et toString est censee etre neutre vis a vis de l'etat de ton objet, alors que la tu depiles carrement les elements pour de bon, et donc suite a un appel a toString ta pile finit vide.
 
Si tu veux eviter de depiler, pars de stk et utilise un pointeur specifique histoire de pas toucher a ta pile:

Maillon m = stk;
while (m!=null)
  s = s + m.element();
  m = m.suivant();
}


(manque encore les virgules, et pas teste)


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 08-10-2013 à 19:26:27    

Je sais pas pourquoi je cherchais compliqué. En voyant ta solution, jme suis presque mis une baffe tellement c'est évident. :S
 
Du coup, ça donne ça  

Citation :


public String toString() {
 
  String s = "[";
  Maillon tmp = stk;
  while (tmp != null){
  s = s + tmp.element() ;
    tmp = tmp.suivant();
    if (tmp !=null) {s = s + ",";}  
    }  
  return s + "]";
 }


 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed