Analyser une expression booléenne
1106. Analyser une expression booléenne
Difficulté : Difficile
Sujets : Chaîne, Pile, Récursion
Une expression booléenne est une expression qui est évaluée comme vraie ou fausse. Il peut prendre l'une des formes suivantes :
- 't' qui est évalué à vrai.
- 'f' qui est évalué à faux.
- '!(subExpr)' qui s'évalue à le NON logique de l'expression interne subExpr.
- '&(subExpr1, subExpr2, ..., subExprn)' qui s'évalue à le ET logique de l'intérieur expressions subExpr1, subExpr2, ..., subExprn où n >= 1.
- '|(subExpr1, subExpr2, ..., subExprn)' qui s'évalue à le OU logique de l'intérieur expressions subExpr1, subExpr2, ..., subExprn où n >= 1.
Étant donné une expression de chaîne qui représente une expression booléenne, renvoie l'évaluation de cette expression.
Il est garanti que l'expression donnée est valide et suit les règles données.
Exemple 1 :
- Entrée : expression = "&(|(f))"
- Sortie : faux
-
Explication :
- Tout d'abord, évaluez |(f) ---> f. L'expression est maintenant "&(f)".
- Ensuite, évaluez &(f) ---> f. L'expression est désormais "f".
- Enfin, retournez false.
Exemple 2 :
- Entrée : expression = "|(f,f,f,t)"
- Sortie : vrai
- Explication : L'évaluation de (faux OU faux OU faux OU vrai) est vraie.
Exemple 3 :
- Entrée : expression = "!(&(f,t))"
- Sortie : vrai
-
Explication :
- Tout d'abord, évaluez &(f,t) ---> (faux ET vrai) ---> faux ---> f. L'expression est maintenant "!(f)".
- Ensuite, évaluez !(f) ---> PAS faux ---> vrai. Nous revenons vrai.
Contraintes :
- 1 <= expression.length <= 2 * 104
- expression[i] est l'un des caractères suivants : '(', ')', '&', '|', '!', 't', 'f' et ','.
Indice :
- Écrivez une fonction "parse" qui appelle les fonctions d'assistance "parse_or", "parse_and", "parse_not".
Solution :
Nous allons décomposer la solution en fonctions plus petites qui gèrent l'analyse et l'évaluation de différents types d'expressions : parse_or, parse_and, parse_not et une fonction d'analyse principale qui gère l'analyse récursive de l'expression. Nous utiliserons une pile pour suivre les expressions imbriquées et les évaluer étape par étape.
Approche:
-
Analyse et récursivité :
- Utilisez une pile pour garder une trace des expressions lorsque vous rencontrez des parenthèses imbriquées.
- Traitez les caractères de manière séquentielle et gérez la pile pour les évaluations imbriquées.
- Lorsque vous rencontrez une parenthèse fermante), extrayez le dernier ensemble d'expressions et appliquez l'opération logique (&, | ou !).
-
Fonctions d'aide :
- parse_or : évalue |(expr1, expr2, ..., exprN) en renvoyant true si au moins une sous-expression est vraie.
- parse_and : évalue &(expr1, expr2, ..., exprN) en renvoyant true uniquement si toutes les sous-expressions sont vraies.
- parse_not : évalue !(expr) en renvoyant l'opposé de la sous-expression.
-
Gestion des expressions :
- Les caractères simples comme t et f se traduisent directement par vrai et faux.
- Lorsqu'une opération est rencontrée (&, |, !), les expressions internes sont évaluées en fonction de leurs règles respectives.
Implémentons cette solution en PHP : 1106. Analyser une expression booléenne
Explication:
-
Fonction principale (parseBooleanExpression) :
- Parcourt l'expression et pousse les caractères vers une pile.
- Lorsqu'il rencontre un ), il collecte tous les éléments entre parenthèses et les évalue en fonction de l'opération (&, |, !).
- Convertit les résultats en « t » (vrai) ou « f » (faux) et les repousse dans la pile.
-
Fonctions d'aide :
- parse_and : renvoie vrai si toutes les sous-expressions sont « t » (vrai).
- parse_or : renvoie vrai si une sous-expression est « t ».
- parse_not : inverse la valeur booléenne d'une seule sous-expression.
Exemple de procédure pas à pas :
-
Entrée : "&(|(f))"
- Traitement de la pile :
- &, (, |, (, f, ), ) → L'expression interne |(f) est évaluée à f.
- Résultant de &(f), qui est évalué à f.
- Sortie : faux.
- Traitement de la pile :
-
Entrée : "|(f,f,f,t)"
- Évalue le | opération:
- Trouver un « t », et l'évaluer est donc vrai.
- Sortie : vrai.
- Évalue le | opération:
-
Entrée : "!(&(f,t))"
- Traitement de la pile :
- !, (, &, (, f, ,, t, ), ) → &(f,t) est évalué à f.
- !(f) est alors évalué à vrai.
- Sortie : vrai.
- Traitement de la pile :
Complexité:
- Complexité temporelle : O(N), où N est la longueur de l'expression. Chaque caractère est traité un nombre limité de fois.
- Complexité spatiale : O(N), en raison de la pile utilisée pour garder la trace des expressions imbriquées.
Cette solution est bien adaptée aux contraintes et devrait gérer efficacement la taille d'entrée.
Liens de contact
Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !
Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :
- GitHub
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Évitez N 1 Problèmes de requête, réduisez le nombre de requêtes de base de données en chargeant à l'avance des données associées; 2. Sélectionnez uniquement les champs requis pour éviter de charger des entités complètes pour enregistrer la mémoire et la bande passante; 3. Utilisez raisonnablement les stratégies de cache, telles que le cache secondaire de la doctrine ou les résultats de requête à haute fréquence de cache de Doctrine; 4. Optimisez le cycle de vie de l'entité et appelez régulièrement () pour libérer la mémoire pour empêcher le débordement de la mémoire; 5. Assurez-vous que l'indice de base de données existe et analysez les instructions SQL générées pour éviter les requêtes inefficaces; 6. Désactiver le suivi automatique des changements dans les scénarios où les modifications ne sont pas nécessaires et utilisez des tableaux ou des modes légers pour améliorer les performances. L'utilisation correcte de l'ORM nécessite de combiner la surveillance SQL, la mise en cache, le traitement par lots et l'optimisation appropriée pour garantir les performances de l'application tout en maintenant l'efficacité du développement.

ReadonlypropertiesInphp8.2CanlybeassignedonceinthestrustructoratDeclarationandcannotBemodifiedAfterward, applicationmutabilityaThelanguageLevel.2.Toachievedeep-immutability, webutableTypeSlikEarrayinArrayobjectorUSustomymutability, webutilletypeslikearraysinarrayobjectoruseseCustomMutabeColEctionSucha.

BCMATHISESSEntialForAccurateCryptoSurrencyCalculsInphpbecausefloating-pointarithmetintroduceUnacceptyrouningerRors.1.floating-pointnumberslike0.1 0.2yieldIxpromiteReSults (par exemple.

RawStringSindomain-Adouven Applications devrait être allongé par ValueObjectStopReventBugsAndImproveTypeSafet

PhpevaluatesconstantexpressionsaTompileTimetoimprovePerformanceAnabledableyerRororDetection.1.ConstantexpressionValuationMeanScomputingValuesDuryCompilementwhenalLallopeandsare connuconsantsliketeral

Utilisez le buzzerforrobusthttprequestswithhehers et les temps.

Les nombres de points flottants sont inexacts est un problème courant en PHP. La réponse est qu'il utilise le format à double précision IEEE754, ce qui rend les décimales décimales incapables d'être représentées avec précision; Les nombres tels que 1,0,1 ou 0,2 sont des décimales de boucle infinie en binaire, et l'ordinateur doit les tronquer pour provoquer des erreurs; 2. Lorsque vous comparez les numéros de points flottants, vous devez utiliser la tolérance au lieu de ==, comme ABS ($ a- $ b)

SwitchCanBeslightlyFasterthanif-elsewhenCatingasingsingsvariabeagainstMultiplesCalarValues, en particulier pour les autorités
