l'analyse mathématique de l'expression en c++
J'ai une question sur l'Analyse des Arbres:
J'ai un string (math expresion estring), par exemple: (a+b)*c-(d-e)*f/g
. J'ai d'analyser cette expression dans un Arbre:
class Exp{};
class Term: public Exp{
int n_;
}
class Node: Public Exp{
Exp* loperator_;
Exp* roperator_;
char operation; //+, -, *, /
}
Quel algorithme puis-je utiliser pour construire un arbre qui représente l'expression de la chaîne ci-dessus?
- double possible de Qui Structure de Données utilisée pour résoudre une simple équation mathématique
- Suppléant réponses à l'OPs question: stackoverflow.com/a/32853177
Vous devez vous connecter pour publier un commentaire.
Utiliser le Shunting-yard algorithme. La wikipédia description est tout à fait complet, j'espère que ça suffira.
Vous pouvez également essayer d'écrire une grammaire formelle, par exemple un l'analyse de l'expression de la grammaire, et l'utilisation d'un outil pour générer un analyseur. Ce site sur les Chevilles listes 3 bibliothèques C/C++ pour les PEG de l'analyse.
(a+b)*c-(d-e)*f/g
est une correction de l'expression.Pour faire facilement une arbre, de les convertir en un Préfixe d'abord l'expression.
De l'Exemple,
préfixe de
(A * B) + (C /D)
est+ (* A B) (/C D)
Votre arbre ressemble alors a + comme son nœud racine. Vous pouvez continuer le remplissage de la gauche et à droite du sous-arbre, sur chaque opérateur.
Aussi, ce lien explique Récursive Descente de l'Analyse en détail, et peut être mis en œuvre.
Première étape est d'écrire une grammaire pour vos expressions. Deuxième étape pour un cas simple est d'écrire un appel récursif à la descente de l'analyseur, c'est l'algorithme que je vous recommande. Voici la page wiki sur les récursive descente parseurs qui a un beau C mise en œuvre.
http://en.wikipedia.org/wiki/Recursive_descent_parser
Vous pouvez utiliser cette grammaire pour créer votre expression.
Et de la suivante pour votre lexer.
L'expression est construite comme vous allez, à l'aide de ces routines:
La routine suivante peut assez d'impression de votre arborescence d'expression:
J'ai écrit une classe permettant de gérer ce retour dans la journée. C'est un peu verbeux et peut-être pas le plus efficace chose sur la planète, mais il gère signé/non signé entiers, double, float, logique et des opérations bit à bit.
Il détecte un dépassement numérique et de dépassement de capacité, renvoie le texte descriptif et les codes d'erreur à propos de la syntaxe, peut être forcé à poignée doubles comme des entiers, ou de l'ignorer signalisation, prend en charge définissables par l'utilisateur de précision et intelligente de l'arrondissement et même de montrer son travail, si vous définissez DebugMode(true).
Enfin...... il ne repose pas sur des bibliothèques externes, de sorte que vous pouvez simplement laisser tomber dans.
Exemple d'utilisation:
La dernière version est toujours disponible via le CMathParser GitHub.