Maison développement back-end tutoriel php Analyser une expression booléenne

Analyser une expression booléenne

Oct 21, 2024 am 06:08 AM

Parsing A Boolean Expression

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 :

  1. É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:

  1. 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 !).
  2. 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.
  3. 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 :

  1. 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.
  2. Entrée : "|(f,f,f,t)"

    • Évalue le | opération:
      • Trouver un « t », et l'évaluer est donc vrai.
    • Sortie : vrai.
  3. Entrée : "!(&(f,t))"

    • Traitement de la pile :
      • !, (, &, (, f, ,, t, ), ) → &(f,t) est évalué à f.
      • !(f) est alors évalué à vrai.
    • Sortie : vrai.

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 :

  • LinkedIn
  • 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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1596
276
Tigne de performance de cartographie relationnelle d'objet (ORM) dans PHP Tigne de performance de cartographie relationnelle d'objet (ORM) dans PHP Jul 29, 2025 am 05:00 AM

É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.

Construire des objets immuables en PHP avec des propriétés en lecture Construire des objets immuables en PHP avec des propriétés en lecture Jul 30, 2025 am 05:40 AM

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

Gestion des calculs de crypto-monnaie: pourquoi BCMath est essentiel en PHP Gestion des calculs de crypto-monnaie: pourquoi BCMath est essentiel en PHP Aug 01, 2025 am 07:48 AM

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

Chaînes comme objets de valeur: une approche moderne des types de chaînes spécifiques au domaine Chaînes comme objets de valeur: une approche moderne des types de chaînes spécifiques au domaine Aug 01, 2025 am 07:48 AM

RawStringSindomain-Adouven Applications devrait être allongé par ValueObjectStopReventBugsAndImproveTypeSafet

Comprendre l'évaluation de l'expression constante dans le moteur de PHP Comprendre l'évaluation de l'expression constante dans le moteur de PHP Jul 29, 2025 am 05:02 AM

PhpevaluatesconstantexpressionsaTompileTimetoimprovePerformanceAnabledableyerRororDetection.1.ConstantexpressionValuationMeanScomputingValuesDuryCompilementwhenalLallopeandsare connuconsantsliketeral

Utilisation de PHP pour le grattage des données et l'automatisation Web Utilisation de PHP pour le grattage des données et l'automatisation Web Aug 01, 2025 am 07:45 AM

Utilisez le buzzerforrobusthttprequestswithhehers et les temps.

Naviguer dans les pièges de l'inexactitude des points flottants dans PHP Naviguer dans les pièges de l'inexactitude des points flottants dans PHP Jul 29, 2025 am 05:01 AM

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)

Déballage des performances: la vérité sur le commutateur PHP vs if-else Déballage des performances: la vérité sur le commutateur PHP vs if-else Aug 02, 2025 pm 04:34 PM

SwitchCanBeslightlyFasterthanif-elsewhenCatingasingsingsvariabeagainstMultiplesCalarValues, en particulier pour les autorités

See all articles