时间限制: 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\n"); 37 else printf("F\n"); 38 } 39 return 0; 40 }
因為是多組數據,所以不要忘了數組重置。
时间: 2024-10-06 16:24:28