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

Algorithmes et structures de données Discussion :

explications sur notation polonaise, postfixe


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut explications sur notation polonaise, postfixe
    Bonjour a tous,

    Je dois réaliser une calculatrice et je pars du principe de me débarrasser des parenthèses. J'ai donc l'idée d'utiliser la notation polonaise inversée (NPI) ou (RPN) et d'utiliser un arbre binaire.

    Mon souchis est la compréhension totale de la NPI.

    - Une fois qu'on a converti en NPI comment repasse-t-on en décimal pour arriver au même calcul (résultat) de départ ?

    - Pourrais-je avoir un exemple sur un calcul avec parenthèses et plusieurs opérandes : ((8 / (3 - 2 + 4 - 5)) * (3 - 1) * 6)

    J'ai bien évidemment passe du temps sur google et je n'ai pas mes reponses alors je demande ici.

    Merci de votre aide et conseils.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    La NPI est juste une représentation postfixe d'un arbre, et peut s'évaluer avec une pile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((8 / (3 - 2 + 4 - 5)) * (3 - 1) * 6)
    Traduit en NPI, donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    8 3 2 - 4 + 5 - / 3 1 - * 6 *
    si je ne suis pas trop rouillé.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Heu....

    Tu m'explique comment tu as fait, la réponse c'est sympa, mais l'explication est ce que je recherche.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Pour faire ça de tête, c'est simple:
    Tu dresses l'arbre de calcul, et tu en fais un parcours postfixe.

    Pour convertir informatiquement, il y a un algo, que j'ai oublié, mais qui a dû être posté plusieurs fois sur le forum. Il implique d'utiliser une pile pour la transformation.
    Je ne peux pas confirmer car mon proxy fait des siennes, mais il me semble que cet algo est disponible quelque part sur Wikipédia.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par Inh[Star]Noz Voir le message
    Heu....

    Tu m'explique comment tu as fait, la réponse c'est sympa, mais l'explication est ce que je recherche.

    Merci
    Il suffit de representer l'expression sous forme d'arbre et de faire un parcours suffixe (aka postorder).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    infixe: (8 / (3 - 2))*4
     
       (*)
       / \
     (/)  4
     / \
    8  (-) 
       / \
      3   2
     
    RPN: 8 3 2 - / 4 *

    Il y a également des algorithmes pour transformer une expression mathématique usuelle (infixe) en représentation RPN, par exemple l'algo "Shunting yard".

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Qu'entends-tu par "je pars du principe de me débarrasser des parenthèses"?

    Veux-tu que ta calculette prenne en entrée des expressions infixe avec parenthèses, et qu'elle stocke ça en interne avec un format à la NPI? ou que l'utilisateur de la calculette tape ses calculs en NPI?

    *LeGEC*

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    oui c'est bien sa.

    Je reçois en paramètre un char * (chaine de caractères) en infixe et je dois en trouver le résultat.

    Je vais donc essayer de convertir infixe -> postfixe et ensuite retrouver le résultat avec un système de pile.

    Je vois mal comment gérer les opérateurs unaires mais je n'y suis pas encore. Je me lance dans le code, vu que j'ai un début d'algorithme.

  8. #8
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    bonjour,

    trouve donc une petite grammaire qui définit ce qu'est une expression arithmétique. Cela te permettra de vérifier que l'expression est juste et ensuite de construire l'arbre automatiquement.
    Fais une recherche dans ce forum, le sujet a déjà été traité.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    ...moué.
    Disons que je ne m'occupe pas de savoir si l'expression est juste ou non pour l'instant.

    Je n'ai peut etre pas compris ce que tu as dit :/

  10. #10
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    bonjour,

    en ayant une grammaire (très simple pour tout ce qui est expression arithmétiques) et en remplaçant chaque élément de la grammaire par une simple fonction (cinq ligne max par fonction), cela te permet de :
    - vérifier que l'expression est juste.
    - construire l'arbre.
    - calculer la valeur de l'expression.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    J'ai avance mon projet. Je n'ai pas utilise d'arbre en fait, mais une liste doublement chainee.

    J'ai actuellement un soucis pour free un element de ma pile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void                   del_elem_stack(t_elem_stack **begin)
    {
      t_elem_stack         *tmp;
     
      tmp = (*begin)->next;
      free(*debut);
      (*debut)->next = 0;
    }
    Mon insertion dans la stack (pile) fonctionne tres bien.

    Je ne comprends pas pourquoi ...
    Si on pouvait me mettre sur la voie, je continue a chercher.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      free(*debut);
      (*debut)->next = 0;
    Ça ne te choque pas, ça ?

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void del_elem_stack(t_elem_stack **ppTop)
    {
    	/* Détacher l'élément */
    	t_elem_stack *pDel = *ppTop;
    	*ppTop = pDel->pNext;
    	pDel->pNext = NULL;
     
    	/* Supprimer l'élément détaché */
    	free(pDel);
    }

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    'lol'

    En fait mon probleme venait de mon parametre passe a ma fonction.
    J'ai resolu le probleme donc presque tout va bien.

    Il me reste un soucis sur l'expression qui est envoye en parametre.
    J'essaie de trouver sinon je poste, je vous remercie d'etre la a repondre, sa pousse a la reflexion ^^

    Bonjour,

    J'ai une liste doublement chainee et j'ai un probleme :

    Lorsque j'empile des element tout se passe bien, pour depiler pareil.
    Mais lorsque je depile le dernier element et que je me retrouve avec une pile vide j'ai un segmentation fault.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion en notation polonaise inversée ou postfixée
    Par pcmessi dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/02/2011, 16h23
  2. Besoin d'une explication sur une "notation" de vista
    Par honeydew dans le forum Windows Vista
    Réponses: 5
    Dernier message: 22/08/2008, 18h35
  3. s.v.p :explication sur le ".h" et dll de l'opengl
    Par Asmod_D dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/11/2004, 11h32
  4. Réponses: 28
    Dernier message: 18/08/2003, 12h54
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18

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