Ce sera plus simple si vous avez utilisé postfix au lieu du préfixe. Voir Reverse Polish Notation (RPN). Étant donné une expression dans RPN, il est facile d'évaluer cela en utilisant une seule pile.
Mais puisque vous avez demandé un moyen d'évaluer le préfixe expressions sans récursivité et en utilisant des piles (pour une manière peut-être plus simple, voir EDIT: ci-dessous), voici une façon:
Nous pouvons le faire en utilisant deux des piles. Une pile (appelez-la évaluation) contient les opérateurs (comme +, sin etc) et les opérandes (comme 3.4 etc) et l'autre pile (appelez-le Count) contient un nombre d'opérandes restant à être vu + le nombre d'opérandes qu'un opérateur attend.
Chaque fois que vous voyez un opérateur, vous poussez l'opérateur sur la pile d'évaluation et poussez le tuple correspondant sur la pile de comptage.
Chaque fois que vous voyez un opérande (comme 3,5 etc), vous vérifiez l'empilement supérieur de la pile Count et décrémentez le nombre d'opérandes restant à voir dans ce tuple.
Si le nombre d'opérandes restant à afficher est égal à zéro, vous supprimez le tuple de la pile Count. Ensuite, à partir de la pile d'évaluation, vous faites apparaître le nombre d'opérandes requis (vous le savez en raison de l'autre valeur de l'uplet), déplacez l'opérateur et effectuez l'opération pour obtenir une nouvelle valeur (ou opérande).
Maintenant, repoussez le nouvel opérande sur la pile d'évaluation. Cette nouvelle poussée d'opérande vous oblige à jeter un autre coup d'œil au sommet de la pile de Count et vous faites la même chose que nous venons de faire (décrémenter les opérandes vues, comparer avec zéro etc).
Si le nombre d'opérandes ne devient pas nul, vous continuez avec le jeton suivant dans l'entrée.
Par exemple dit que vous deviez évaluer + 3 + 4/20 4
Les piles ressembleront (à gauche est le haut de la pile)
Count Evaluation Input
+ 3 + 4/20 4
(2,2) + 3 + 4/20 4
(2,1) 3 + + 4/20 4
(2,2) (2,1) + 3 + 4/20 4
(2,1) (2,1) 4 + 3 + /20 4
(2,2) (2,1) (2,1) /4 + 3 + 20 4
(2,1) (2,1) (2,1) 20/4 + 3 + 4
(2,0) (2,1) (2,1) 4 8/4 + 3 +
Since it has become zero, you pop off two operands, the operator/
and evaluate and push back 5. You pop off (2,0) from the Count stack.
(2,1) (2,1) 5 4 + 3 +
Pushing back you decrement the current Count stack top.
(2,0) (2,1) 5 4 + 3 +
Since it has become zero, you pop off 5,4 and + and evaluate and push back 9.
Also pop off (2,0) from the count stack.
(2,0) 9 3 +
12
EDIT:
A ami a suggéré un moyen de le faire sans piles multiples:
Commencez par la fin, allez au premier opérateur. Les jetons à la droite de cela seront des opérandes. Évaluer et refaire Cela semble beaucoup plus simple que de le faire avec deux piles. Nous pouvons utiliser une liste doublement chaînée pour représenter l'entrée que nous changeons pendant le traitement. Lorsque vous évaluez, vous supprimez des nœuds, puis insérez le résultat. Ou vous pourriez peut-être utiliser une pile.
Est-ce devoir? –
Pourquoi avez-vous besoin de supports alors? – Andrey
S'il peut être exprimé avec récursion, il peut être exprimé avec une pile. – KLee1