首页 > 其他分享 >【115】

【115】

时间:2022-11-05 19:55:11浏览次数:101  
标签:运算符 运算 115 括号 expression stack 表达式

1106. 解析布尔表达式  

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

  • "t",运算结果为 True
  • "f",运算结果为 False
  • "!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
  • "&(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 与的运算(AND)
  • "|(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 或的运算(OR)

 

示例 1:

输入:expression = "!(f)"
输出:true

示例 2:

输入:expression = "|(f,t)"
输出:true

示例 3:

输入:expression = "&(t,f)"
输出:false

示例 4:

输入:expression = "|(&(t,f,t),!(t))"
输出:false
------------------------------------------------------------------------------------------------------------------
看到带括号的表达式就选择使用栈来进行操作,括号之前是运算符,逻辑 '非' 中有一个表达式,逻辑 '与' 和逻辑 '或' 都有两个或者以上的表达式。
从左到右遍历布尔表达式,对于不同的字符有以下操作:
  1.如果是逗号则跳过;
  2.如果是左括号,运算符或者't','f',则入栈;
  3.如果是右括号,则需要返回一对括号里的内容:将栈内元素依次弹出,直到栈顶元素为左括号为止,然后将左括号和运算符弹出,记录弹出元素中't'和'f'的数量。
根据运算符以及弹出't','f'的数量计算一对括号里的值:
  1.如果运算符是'!',将括号内的值取反;
  2.如果运算符是'&',如果括号内所有元素都是't',则结果是't',否则结果是'f',即如果'f'的个数为0,返回't',否则返回'f';
  3.如果运算符是'|',如果括号内't'的个数不为0时,返回't',否则返回'f'。
 1 class Solution {
 2     public boolean parseBoolExpr(String expression) {
 3         Deque<Character> stack = new ArrayDeque<>();
 4         for(int i = 0; i < expression.length(); i++){
 5             char ch = expression.charAt(i);
 6             if(ch == ','){
 7                 continue;
 8             }else if(ch != ')'){
 9                 stack.push(ch);
10             }else{
11                 int t = 0, f = 0;
12                 while(stack.peek() != '('){
13                     char value = stack.pop();
14                     if(value == 't'){
15                         t++;
16                     }else{
17                         f++;
18                     }
19                 }
20                 stack.pop();
21                 char symbol = stack.pop();
22                 if(symbol == '!'){
23                     stack.push(t == 1 ? 'f':'t');
24                 }else if(symbol == '&'){
25                     stack.push(f == 0 ? 't':'f');
26                 }else{
27                     stack.push(t != 0 ? 't':'f');
28                 }
29             }
30         }
31         return stack.pop() == 't';
32     }
33 }

 



标签:运算符,运算,115,括号,expression,stack,表达式
From: https://www.cnblogs.com/wzxxhlyl/p/16860865.html

相关文章

  • 洛谷 P1153 点和线
    前置知识(1)求两条线段的交点方法1,运用高中的解析几何知识求.方法2,运用向量点积求.考虑向量叉乘。若\(\veca\times\vecb>0\),那么\(\vecb\)在\(\veca\)......
  • 115.distinct-subsequence 不同的子序列
    问题描述115.不同的子序列解题思路dp[i][j]表示考虑考虑t的前j个字符在s的前i个字符中的出现个数:if(s[i-1]==t[j-1])dp[i][j]=dp[i-1][j-1]+dp[i-......
  • 重建控制文件出现ORA-01159、ORA-01517告警
    问题描述:将windows上的数据文件、控制文件拷贝到linux相应目录后,重建控制文件出现ORA-01159、ORA-01517告警,如下所示:源端:windows200332位+oracle10.2.0.432位目标端:ce......
  • uva 11552
    给你一个长度 k ,一个字符串 S(都为小写字母),保证 S 的长度为 k的整数倍。将 S 按顺序分为 S/k 组,组内字符可以重新排列问最少有几个块?(如fff,ww) 枚举开头......
  • uva 11584
    给一个字符串,划分成最少的回文串如aaadbccb---->aadbccb f[i]=miin{f[j]+1}j<i, 且s[j...i]是回文串 #include<iostream>#include<cstring>using......
  • CF1156E Special Segments of Permutation
    题目链接:​​传送门​​直接枚举最大值往左右扩就过了,,*/#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorit......
  • UVA 11594(All Pairs Maximum Flow-两两之间的最大流,Gusfield算法)
    已知一个n<=100个点的无向图,求任意两点间的最大流(最小割)Gusfield专门解决这类问题#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<func......
  • Codeforces Round #747 (Div. 2) D Educational Codeforces Round 115 D
    D.TheNumberofImposters显然我们对于每一个关系就相当于连一个无向边我们显然对于每一个连通块来讲我们确定其中一个也就确定了这个连通块里的所有就相当于二分图......
  • 【题解】CF1151C Problem for Nazar(二分答案)
    【题解】CF1151CProblemforNazar距离CSP剩下10天了,据说考前写题解可以增加RP所以我来写一篇题解+水点贡献分看题解区没有用二分答案来解决这道题的,我来提供一个......
  • CF1153F 题解
    传送门题意有一段长为\(l\)的线段,有\(n\)个区间,左右端点在\([0,l)\)间均匀随机(可能不是整数)。求期望被至少\(k\)段区间覆盖的长度,对\(998244353\)取膜模。题......