2010-11-10 27 views
2

Je fais un programme chargé de convertir une expression mathématique telle que (2+4)*(4/3) en un arbre binaire, puis de le manipuler. Tout d'abord, lors de l'analyse, j'ai transformé la chaîne en deux piles, opérandes et opérateurs. Comment puis-je déterminer ce que la racine doit être, étant donné que dans mon exemple ci-dessus l'arbre devrait ressembler à ceci:Parse pile dans un arbre binaire?

 * 
    /\ 
    + /
    /\ /\ 
    2 4 4 3 

Notez que la racine est * qui est l'opérande la plus externe. Mais sur mon pile d'opérandes, il ressemble à ceci:

/ 
* 
+ 

Et il pourrait y avoir des cas comme (2+4+3)*4 ou 2*((4+1)/3).

Comment puis-je déterminer quel opérande doit être la racine de mon arbre binaire?

+0

Est-ce que l'analyseur comprend les règles de priorité, ou utilisez-vous toujours des parenthèses pour le forcer? –

+0

Je dois aussi créer un analyseur (jusqu'à présent je l'ai juste trié entre les opérandes et les opérateurs, et en gardant la trace des parenthèses). Mais oui, les crochets seront toujours là (pas de règles de préséance). – Blackbinary

+3

duplication possible de [Créer un arbre binaire à partir d'une pile?] (Http://stackoverflow.com/questions/4149437/create-a-binary-tree-from-a-stack) –

Répondre

3

Convertissez votre expression infixe en notation de préfixe ou de suffixe. Vous ne pouvez pas vraiment avoir une pile d'opérateur appropriée sans cela.

Dans la notation postfix, l'expression (2+4)*(4/3) ressemblerait à ceci:

2 4 + 4 3/* 

Donc, vous avez la multiplication apparaissant à la fin qui pourrait être inséré dans l'arbre comme sa racine. L'évaluation d'une expression postfix est beaucoup plus facile pour un ordinateur car le regroupement n'est pas nécessaire.

+0

Ah, merci. J'ai oublié que je devais le transformer en postfix. Cela rendrait les choses beaucoup plus faciles. – Blackbinary

1

Vous ne pouvez pas simplement placer les opérateurs sur votre pile dans l'ordre dans lequel ils apparaissent dans votre expression. Une fois que vous avez fait cela, vous perdez la capacité de désambiguïser, comme vous l'avez identifié.

Voir par exemple. http://en.wikipedia.org/wiki/Shunting_yard_algorithm pour un algorithme pour analyser la notation infixe.

+0

Merci pour le rappel. D'oh, c'est tout ce que j'ai à dire. – Blackbinary