布尔表达式

时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold
题目描述 Description

给出一个布尔表达式,计算其值。

我们用T表示[真],F表示[假],&表示运算 逻辑[与],|表示运算 逻辑[或]

如果你不是很清楚 逻辑[与] 和 逻辑[或] 的含义,下面给出了运算表:

A    B    A&B    A|B

T    T       T        T

T    F       F        T

F    T       F        T

F    F       F        F

运算符优先级:

允许使用圆括号调整优先级,优先计算圆括号中的表达式,在同层,&运算符的优先级要高于|的优先级。

输入描述 Input Description

第一行一个整数n,表示数据组数。

接下来每组数据占一行,为一个布尔表达式。

输出描述 Output Description

输出共n行,分别表示每组数据的计算结果,每行输出应为T或F。(有回车)

样例输入 Sample Input

3

T&F

F&(F&T|F)

F&F|T

样例输出 Sample Output

F

F

T

数据范围及提示 Data Size & Hint

对于前30%的数据,n=1。

对于100%的数据,n<=1000,任意表达式长度l<=1000,输入数据保证合法。

代碼實現:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int n,l,fl[3000],a,b;
 6 char ch[6000];
 7 int main(){
 8     scanf("%d",&n);
 9     while(n--){
10         scanf("%s",ch);fl[0]=0;
11         l=strlen(ch);
12         for(int i=0;i<=l;i++){
13             if(ch[i]=='|'||ch[i]=='&'||ch[i]=='(') fl[++fl[0]]=ch[i];
14             if(ch[i]=='T') fl[++fl[0]]=1;
15             if(ch[i]=='F') fl[++fl[0]]=0;
16             if(ch[i]==')'||i==l){
17                 a=b=fl[0];
18                 while(fl[a]!='('&&a>0) a--;
19                 for(int j=a+1;j<=b;j++){
20                     if(fl[j]=='&'){
21                         fl[j-1]=fl[j-1]&fl[j+1];
22                         for(int k=j;k<=b-2;k++) fl[k]=fl[k+2];
23                         b-=2;j-=2;
24                     }
25                 }
26                 for(int j=a+1;j<=b;j++){
27                     if(fl[j]=='|'){
28                         fl[j-1]=fl[j-1]|fl[j+1];
29                         for(int k=j;k<=b-2;k++) fl[k]=fl[k+2];
30                         b-=2;j-=2;
31                     }
32                 }
33                 fl[0]=a;fl[a]=fl[a+1];
34             }
35         }
36         if(fl[1]) printf("T
");
37         else printf("F
");
38     }
39     return 0;
40 }

因為是多組數據,所以不要忘了數組重置。

原文地址:https://www.cnblogs.com/J-william/p/6194510.html