2012-03-17 3 views
3

Après avoir fait des recherches, j'ai découvert la notation postfixée et comment analyser une expression.Comment puis-je évaluer une expression avec sin, cos et d'autres fonctions?

Mon code est converti en notation postfixée, puis il l'évalue à l'aide de la méthode basée sur la pile. Par exemple:

Initial expression: 5 + 2^(4 - 1) 
Postfix notation: 5 2 4 1 -^+ 
Result: 13 

Maintenant, je suis en train d'étendre ce programme pour être en mesure d'évaluer les expressions avec des fonctions, comme sin, cos, log, par exemple: 5 + sin (2 + log (2)). Mon idée initiale était, avant de l'analyser, de trouver ces fonctions, d'évaluer leurs résultats et de les remplacer dans la chaîne. Mais je ne pense pas que ce soit une très bonne idée ...

Alors, comment puis-je faire cela de manière efficace?

Voici un code écrit en C#, s'il est d'usage: http://pastebin.com/7wB81fyQ, mais je préférerais un pseudo-code pour que je comprenne mieux ce que j'écris mieux ... Je ne suis pas un de ces gars qui il suffit de copier et coller.

+1

Les fonctions (par exemple 'sin',' cos', etc.) sont en notation ** préfixe **. Vous avez juste besoin d'appliquer une règle d'analyse différente. –

+2

Tout cela est expliqué par l'algorithme de Shunting-Yard, ici: http://en.wikipedia.org/wiki/Shunting-yard_algorithm – RBarryYoung

+0

@RBarryYoung Merci, je vais essayer cet algorithme. – Tibi

Répondre

1

Traitez ces fonctions comme tout autre opérateur plus les accolades. Commencez par calculer ce qu'il y a dans les accolades, puis exécutez la fonction.

Initial: 3 * Sin(4 + 5) 
Postfix: 4 5 + Sin 3 *  (that's how I would enter it in a HP calculator) 
or:  3 4 5 + Sin * 

Autre que +, qui consomme deux nombres, Sin consomme un seul numéro.

+0

Je ne travaillerais pas avec des cordes. Il y a une belle classe 'Stack ' dans 'System.Collections.Generics'. –

+0

Oui exactement, mais j'avais besoin de l'algorithme Shunting-Yard pour générer le postfix correct. – Tibi

Questions connexes