Transformer une expression en notation polonaise en C

mohamedaat Messages postés 3 Date d'inscription dimanche 8 janvier 2012 Statut Membre Dernière intervention 16 avril 2012 - 16 avril 2012 à 19:00
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 16 avril 2012 à 19:46
Bonjour,
s'ils vous plait qui peut m'aider à trouver mon problème dans mon programme qui sert à transformer une expression en notation polonaise,l'algorithme me parait correct et je sais que le problème est dans la fonction tester() et la fonction empiler() au niveau de caractère à empiler , j'ai pas mal de fois tenter mais sans résultat :(
voilà mon programme:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
# define max 100
typedef struct element
{
char *donnee[1];
struct element *precedent;
}maillon;
typedef maillon* Pile;

Pile mapile=NULL; // initialisation de la pile
Pile pile2; // une pile intérmidaire
char t[max]; // un tableau de type caractère qui contient la chaine
int k;// la taille de la chaine
char *var[1];
//--------empiler-----------------------


Pile empiler(Pile mapile)
{
Pile nouveau;
nouveau=(Pile)malloc(sizeof(Pile)); //Réservation de l'espace mémoire pour le nouveau élément
(mapile->donnee[0]=var[0]); //Affectation
mapile->precedent=mapile;
mapile=nouveau;
return mapile;
}
//-------------dépiler-------------------
Pile depiler(Pile mapile)
{


if(mapile->precedent==NULL)
{
free(mapile);
return NULL;
}
Pile nvSommet=mapile->precedent;//o fait stocker l'avant dernier dans une variable temporaire et puis on libert le sommet
free(mapile);
return nvSommet;
}
//-----------------afficher la pile-----------------------
Pile afficher(Pile ptr)
{
if(ptr!=NULL)
{
Pile tmp=ptr;
while(tmp!=NULL)
{
printf("%s",tmp->donnee);
tmp=tmp->precedent;
}
}
}
//----------------pour empiler le sommet de la pile dans l'autre
Pile empiler1(Pile ptr, Pile temp){
if(temp!=NULL){
Pile nouveau=(Pile)malloc(sizeof(Pile));
nouveau->donnee[0]=temp->donnee[0];
ptr->precedent=nouveau;
nouveau=ptr;
}
return ptr;
}

//---------------------tester pour remplir---------------
Pile tester(){
int i=0;
k=strlen(t); // la longueur de la chaine
for(i=0;i<k;i++){
var[0]=t[i];
if((t[i]!='-')&& (t[i]!= '/') && (t[i]!= '*') && (t[i]!= '+')&& (t[i]!= '(' )&& (t[i]!= ')' ))
{// si il est égal à un opérande on l'empile
mapile=empiler(mapile);
}
else {
if((t[i] = '(' ) ){// si on arrive à la parenthèse ouvrante
pile2=empiler1(pile2,mapile);// on empile le sommet de la pile principale dans une pile temporaire
mapile=depiler(mapile); // on dépile la pile principale
}

mapile=empiler(mapile); // on met l'opérateur dans la pile
while(pile2!=NULL){ // si la pile secondaire n'est pas vide
mapile=empiler1(mapile,pile2); // on remet ce qu'on a retiré de la pile principale
pile2=depiler(pile2); // on dépile la pile temporaire pour la libérer
}
i++; // on incrémante le conteur pour passer par tous les caractères
}
}
return mapile;
}
//------------------pour mettre le contenu de la pile dans une autre pile-----------------------------------
Pile remettre(Pile ptr,Pile anc){
free(ptr);// on assure que la deuxième pile est vide pour mettre le contenu de la pile principale dedans
while(anc!=NULL)
{ // tant que la pile principale contient une donnee
ptr=empiler1(ptr,anc); // on empile la pile temporaire qu'on va afficher
anc=depiler(anc); // on dépile élément par élément de la pile principale
}
}
//----------programme principal------------------------
int main()
{
printf("\nDonner votre expression arithmétique :");
gets(t);
tester();
remettre(pile2,mapile);
printf("\nla notation polonaise----> :");
afficher(pile2);
getch();
}


merci d'avance

Les choses ne sont pas ce qu'elles semblent être

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 avril 2012 à 19:46
Bonjour.

Si tu ne fais pas l'effort d'utiliser les balises de code et surtout d'indenter ton code, on ne fera pas l'effort de te répondre...
(Deuxième fois que je te le dis en plus).


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous