Ceci est une question d'entrevue Je suis confus à propos de sa solution, je pense que j'ai besoin de piles pour pousser et faire sauter ces opérateurs et ses opérandes, Mais ai-je besoin de deux piles, une pour l'opérateur et une pour les opérandes? ou une seule pile ferait-elle? Je pense que nous avons besoin de deux piles mais y a-t-il un moyen de résoudre en utilisant une pile? p>
Aussi, je suis un peu confus, comment cela fonctionnerait-il, chaque fois que je reçois un opérateur, je publierais deux de mes opérandes les plus hauts et poussez le résultat dans la pile d'opérande p>
Le préférence est d'abord les supports, puis divisez, multiples et dernière soustraction, puis addition p>
Mais comment vérifier quand vous pouvez faire sauter les deux opérandes et faire l'opération arthimétique nécessaire? P>
6 Réponses :
Eh bien. Ça analyse. C'est tout à fait une œuvre .. Une personne à moi a écrit un programme très impressionnant, exactement pour cela, qui ouvre également une équations variables, tout en OOP. très soigné. p>
Fondamentalement, faites une liste des opérateurs commander, commencez avec les supports. P>
Trouver le plus de communes: recherchez le premier) [Fermer] à partir de là, puis de la recherche pour la première ([Ouvrir]. P>
Vous avez maintenant votre phrase interne sans crochets. Maintenant, recherchez * par exemple, trouvez le numéro derrière et le numéro après, remplacez maintenant cette phrase (E.G. 514 * 354.25) avec la réponse informatique. P>
C'est le moyen le plus primitif de le faire .. vient de vous donner un départ. Pour la réinitialisation, vous n'avez probablement aucun choix en utilisant votre cerveau: p p>
(Si vous êtes intéressé par le projet de mon ami, dites simplement) p>
Je ne suis pas l'électeur du bas et je sens que votre solution va bien. Cependant, il s'agit de la solution la plus naïve et des bibliothèques standard (voir ma réponse) et des algorithmes standard (Matt + Robert) existent pour cette classe de problème.
Ouais je sais, mais si le gars demande cela, il ferait mieux de commencer par les bases, n'est-ce pas? Et j'ai écrit c'est le plus naïf. (BTW, ce n'est pas comme ça que mon ami l'a fait).
Vous analysez des expressions avec une structure définie de manière récursive. Une option simple consiste à écrire ce qu'on appelle un analyseur décent récursif: P>
voir http://fr.wikipedia.org/wiki/recursive_descent_parser P >
Il est directement avancé une fois que vous comprenez que la routine du haut niveau "parse expression" doit s'appeler lui-même pour analyser ses expressions constitutives telles que l'expression + expression. Ce que vous allez vous retrouver avec un arbre de nœuds de l'opérateur avec des arbres d'expression pour les opérandes. p>
Vous pouvez également utiliser un outil comme Bison. Bison est un "compilateur compilateur" qui construit un analyseur piloté de table pour une langue donnée une grammaire. (Bison est assez ancienne école: recherchez un "générateur de parser" pour plus d'informations.) P>
Jetez un coup d'œil au Algorithme de cour en train de la cour . P>
L'algorithme de coureurs de courage est un PROCÉDÉ DE PARSING MATHÉMATIQUE équations spécifiées dans la notation d'infixe. Il peut être utilisé pour produire une sortie dans Notation de polissage inversée (RPN) ou en tant que Arbre de syntaxe abstraite (AST). Les L'algorithme a été inventé par Edsger Dijkstra et nommé le "cour de la courge" algorithme parce que son opération ressemble à celui d'une trafiquante ferroviaire yard. p> blockQuote>
Je l'ai mis en œuvre dans très peu de lignes de code à l'aide de l'analyseur Sweet Spirit. Cela a vraiment bien fonctionné pour moi dans une variété de contextes. ( http://spirit.sourceforge.net/ ) p>
Elaborer: L'analyseur Spirit vous permet de construire une grammaire en BNC normalisée et crée un arbre ast de l'expression - vous pouvez alors parcourir de manière triviale cet arbre (en cas d'environnement d'interprétation) et calculez l'expression. Une courbe d'apprentissage courte pour l'esprit et la BNC sera nécessaire, mais c'est certainement plus facile que de rouler votre propre évaluateur d'expression p>
-1 parce que cela n'adore pas vraiment la personne qui pose la question de quelque manière que ce soit.
Ajout d'une explication plus explicite des capacités de boost à cet égard; J'espère que cela fera plus pour aider la personne à demander.
Ce problème s'appelle un analyseur de descente récursif. Il peut y avoir d'autres formes de solution canonique, je suis sûr qu'il y a - peut-être des dizaines d'approches correctes. David Eck a un analyseur de descente récursif publié en ligne avec code source et explication. Google devrait présenter des milliers de ressources utiles et celles-ci devraient également être examinées à DMOZ et à votre moteur de recherche préféré. p>
Si c'est une question d'entretien d'embauche, l'affiche originale indique que c'est, il est peu probable que le candidat soit censé produire des objets de chapeau tels que des algorithmes de cour, des analyseurs de descente récursifs, convertir l'infixe sur Postfix et al em> tous dans une demi-heure maximale peut-être, et tirez-le. P>
Non. Ils testent probablement votre capacité à gérer des objets comme des chaînes, de les tester pour des éléments tels que les opérateurs {*, /, +, -}, des parenthèses gauche et droite, des chiffres, etc. et de voir si vous pouvez écrire du code / pseudocode pour évaluer l'exemple expression < fort> ils ont fourni forte>, pas une application tout-chant et tout-chant. p>
D'autre part si vous voulez un exemple de comment écrire un évaluateur pour les chaînes telles que "(1 + 3 * (5/4))" qui renvoie un résultat numérique, voici quelques Exemples C ++ / Java . P>
Appuyé. Une solution fantaisie dans la pratique peut ne pas fonctionner dans une interview de moins d'une heure.
Je suis trop paresseux pour essayer de répondre à votre question, mais cela pourrait valoir la peine d'examiner le "Le langage de programmation C ++" de B. STROSTRUP. Son exemple est un programme de bureau.
Les expressions comme celle de votre question sont souvent mieux modélisées avec des arbres, plutôt qu'avec des piles. Bonne chance!
Ceci est une question couramment posée à ce sujet. Voici un: Stackoverflow.com/questions/1151127/...
@EveryOne merci pour l'entrée, mauvaise recherche avec ces aides et aussi comment il peut être modélisé avec des arbres
Questions originales et les plus faisant autorité des compilateurs (et ceci est une question compilatrice): Stackoverflow.com/questions/1669/Learning-a-Write-A-Compile R . Code Golf Questions avec une solution très courte sous différentes contraintes: Stackoverflow. com / questions / 928563 / ... Stackoverflow.com/Questtions/1384811/... Stackoverflow.com/Questtions/1538964/...