IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Pile - Liste chaînée


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Pile - Liste chaînée
    Bonjour,
    je me retrouve bloqué face à une méthode pourtant simple sur le papier.

    Le but est de réaliser une pile d'objets en utilisant une liste chaînée. Voici l'interface :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public interface PileI {
     
        public final static int CAPACITE_PAR_DEFAUT = 6;
     
        public void empiler(Object o) throws PilePleineException;
        public Object depiler() throws PileVideException;
     
        public Object sommet() throws PileVideException;
        public int capacite();
        public int taille();
        public boolean estVide();
        public boolean estPleine();
     
        public boolean equals(Object o);
        public int hashCode();
        public String toString();
    }
    Pour la liste chaînée, c'est sur la méthode estPleine() que je bloque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public class PileListe implements PileI, Cloneable {
    	/** la liste des Maillons/Elements */
    	private Maillon stk;
    	/** la capacité de la pile */
    	private int capacite;
    	/** le nombre */
    	private int nombre;
     
    	/**
             * Classe interne "statique" contenant chaque élément de la chaine
             */
    	private static class Maillon implements Cloneable {
    		private Object element;
    		private Maillon suivant;
     
    		public Maillon(Object element, Maillon suivant) {
    			this.element = element;
    			this.suivant = suivant;
    		}
     
    		public Maillon suivant() {
    			return this.suivant;
    		}
     
    		public Object element() {
    			return this.element;
    		}
     
    		public Object clone() throws CloneNotSupportedException {
    			Maillon m = (Maillon) super.clone();
    			m.element = element;
    			return m;
    		}
    	}
     
    // code constructeur etc
     
    public boolean estPleine() {
    		return false ; // TODO
    	}
    Merci pour toute aide

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 108
    Points : 255
    Points
    255
    Par défaut
    Pour ta methode estPleine(), je pense qu'il te suffit de comparer la taille de la liste avec ta constante CAPACITE_PAR_DEFAUT .
    Si taille() >= CAPACITE_PAR_DEFAUT return true
    sinon return false

  3. #3
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Sinon tu peux aussi garder un int comme compteur dans ta structure de pile. Ça te permet d'avoir à tout moment la taille sans avoir a tout recalculer, et ainsi tu peux tester sa valeur pour savoir si tu as atteint la capacité max de ta pile.

  4. #4
    Membre éclairé Avatar de Ceddoc
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 493
    Points : 698
    Points
    698
    Par défaut
    Citation Envoyé par Noctis Voir le message
    Pour ta methode estPleine(), je pense qu'il te suffit de comparer la taille de la liste avec ta constante CAPACITE_PAR_DEFAUT .
    Si taille() >= CAPACITE_PAR_DEFAUT return true
    sinon return false
    Pourquoi prendre la capacité par défaut vu qu'il a capacite()?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    J'ai procédé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    //....
       //constructeur
        public PileListe(int taille) {
    		if (taille <= 0)
    			taille = CAPACITE_PAR_DEFAUT;
    		this.stk = null;
    		this.capacite = taille;
    	}
     
            //constsructeur par defaut
    	public PileListe() {
    		this(PileI.CAPACITE_PAR_DEFAUT);
    	}
     
           public void empiler(Object o) throws PilePleineException {
    		if (estPleine())
    			throw new PilePleineException();
    		stk = new Maillon (o,stk);
    		nombre = nombre + 1 ;
    		}
     
     
          // ....
     
     
          public int taille() {
    		return nombre;
    	}
     
           public boolean estVide() {
    		return stk == null ;
    	}
     
          public boolean estPleine() {
    		return this.taille() >= capacite ; 
    	}
     
      //...
     
       }

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    juste une petite question: c'est un TP pour étudiant ?

    Car sinon, une collection de type Queue (ou Dequeue) a toutes les fonctionnalités que tu souhaites.

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Février 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 108
    Points : 255
    Points
    255
    Par défaut
    Citation Envoyé par Ceddoc Voir le message
    Pourquoi prendre la capacité par défaut vu qu'il a capacite()?
    Oups j'avais pas cette méthode donc en effet, il serait mieu d'appeller celle-ci

  8. #8
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par plawyx Voir le message
    juste une petite question: c'est un TP pour étudiant ?

    Car sinon, une collection de type Queue (ou Dequeue) a toutes les fonctionnalités que tu souhaites.
    Oui c'est un TP avec contraintes "forcées".

    Je suis un peu coincé sur une dernière méthode pour cette classe. 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 redonne le code de la classe au quasi complet pour plus de clarté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    public class PileListe implements PileI, Cloneable {
     
        private Maillon stk;
     
        private int capacite;
     
        private int nombre;
     
           private static class Maillon implements Cloneable {
            private Object element;
            private Maillon suivant;
     
            public Maillon(Object element, Maillon suivant) {
                this.element = element;
                this.suivant = suivant;
            }
     
            public Maillon suivant() {
                return this.suivant;
            }
     
            public Object element() {
                return this.element;
            }
     
            public Object clone() throws CloneNotSupportedException {
                Maillon m = (Maillon) super.clone();
                m.element = element;
                return m;
            }
        }
     
     
        public PileListe(int taille) {
            if (taille <= 0)
                taille = CAPACITE_PAR_DEFAUT;
            this.stk = null;
            this.capacite = taille;
        }
     
        public PileListe() {
            this(PileI.CAPACITE_PAR_DEFAUT);
        }
     
        public void empiler(Object o) throws PilePleineException {
            if (estPleine())
                throw new PilePleineException();
            stk = new Maillon (o,stk);
            nombre = nombre + 1 ;
            }
     
        public Object depiler() throws PileVideException {
            if (estVide())
                throw new PileVideException();
            if (stk != null) {
              Object o = stk.element();
              stk = stk.suivant();
              return o;
              }
              else return null;
     
        }
     
        public Object sommet() throws PileVideException {
            if (estVide())
                throw new PileVideException();
            return stk.element ; 
        }
     
         public boolean estVide() {
            return stk == null ;
        }
     
        public boolean estPleine() {
            return this.taille() >= capacite ; 
        }
     
          // ici je coince un peu
            public String toString() {
     
            String s = "[";
             Stack temp = new Stack();
           while (!this.estVide()) {
                 temp.push(stk.element);
                  s = s + stk.element;
                }
            return s + "]";
        }
     
        //...
     
        public int capacite() {
            return this.capacite;
        }
     
       //...
        public int taille() {
            return nombre;
        }
    }
    Merci d'avance

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 553
    Points : 21 611
    Points
    21 611
    Par défaut
    Hum. Ce "Stack" ne me semble pas une bonne idée.
    La solution la plus simple que je vois, c'est une approche récursive.

    Vu qu'on est en section "débutant" je vais en dire plus :

    - tu devrais définir une méthode private String buildString(Maillon maillon) qui prend, donc, un Maillon en paramètre.
    Et elle renvoie une String qui montre tous les éléments dans l'ordre où ce maillon et ses suivants ont été empilés.
    - je rappelle que cette méthode buildString() a le droit de s'appeler elle-même...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. parcourir une pile (liste simple chaînée)
    Par rutabagas dans le forum C
    Réponses: 3
    Dernier message: 04/10/2007, 16h08
  2. Liste chaînée
    Par kilinette dans le forum C
    Réponses: 6
    Dernier message: 17/10/2005, 23h45
  3. Listes chaînées circulaires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 11/05/2005, 13h44
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo