D'abord, tu utilises cstring au lieu de string.h Ensuite: temp->prec=mapile;//on fait pointer le precedent de ce nouveau sur le sommet On doit faire pointer le nouveau vers le premier de la pile et le sommet vers le nouveau.
Le Tout est souvent plus grand que la somme de ses parties.
Tu appelles ta fonction verification une seule fois après avoir lu tout ton fichier. Dans verification, tu es censé avoir une chaîne en entrée. Affiches cette chaîne.
Tu empiles les '(', '{', '[' mais tu dois dépiler quand tu rencontres leur équivalent complémentaire.
Comment valides-tu la chaîne ({[]} ?)
- Edité par PierrotLeFou 1 mai 2023 à 17:54:50
Le Tout est souvent plus grand que la somme de ses parties.
Autre détail, quand tu dépiles, tu peux te retrouver avec une pile vide si ta chaîne n'est pas jumelée correctement. On peut tester si la chaîne est vide et retourner '\0' dans ce cas.
Et la pile doit être vide à la fin de la validation.
@rouIoude: je pense que c'est correct de quitter si le jumelage ne peut pas être fait.
@rouIoude: je pense que c'est correct de quitter si le jumelage ne peut pas être fait.
Un return sans condition dans une boucle ça sort direct, la boucle ne sert à rien. C'est pour cela que je lui ai dit de faire attention à son indentation. Car une fois indenté on le voit de suite.
On trouve: empiler(p,i); je pensais qu'on devait empiler le caractère et non l'indice ...
- edit: C'est plus compliqué à gérer si on n'a pas de descripteur de liste. J'ai utilisé un pointeur vers un pointeur. Je n'avais pas le goût de le faire avec un fichier. J'ai modifié le main pour lire directement à la console. Ce n'est pas une bonne pratique que de faire un typedef avec un pointeur. C'est moins facile à suivre. Comment as-tu pu compiler sans l'entête stdbool.h ? Le ifndef, etc, n'étaient pas nécessaires ici.
Si on s'emmerde avec les pointeurs, on peut utiliser un tableau pour la pile. Par exemple, si on connait la longueur maximum du tableau: typedef struct Pile Pile; struct Pile { size_t empile; // Nombre d'éléments dans la pile. char pile[LONGUEUR]; }; Pour empiler: p->pile[p->empile++] = c; pour dépiler (tester si la pile n'est pas vide): char c = p->pile[--p->empile]; le sommet est à: char c = p->pile[p->empile-1];
Bon, je rabâche, mais la représentation d'une pile par une liste chaînée, c'est emmerdant à programmer, et c'est épouvantable inefficace (ratio charge utile/taille des machins alloués), surtout pour empiler un octet.
Une solution avec une pile de capacité fixe (dans un tableau)
#define CAPACITE_PILE 100
enum Etat verif_parentheses(const char chaine[])
{
char pile[CAPACITE_PILE];
int taille = 0;
for (const char *p = chaine; *p != '\0'; p++) {
if (est_ouvrant(*p)) {
pile[taille++] = *p;
} else if (est_fermant(*p)) {
if (taille == 0) {
return P_EN_TROP;
}
char ouvrante = pile[--taille];
if (! correspond(ouvrante, *p)) {
return P_INCORRECTE;
}
} else {
// les autres caractères sont ignorés
}
}
if (taille != 0) {
return P_MANQUANTE;
}
return P_OK;
}
Comment as-tu pu compiler sans l'entête stdbool.h ?
Probablement son fichier est un .cpp
...
verification d'une chaine a l'aide d'une pile
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
j'ai une erreur le code ne fait pas la verification il lit seulement la phrase qui est dans le fichier
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.