时间限制: 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 #include2 #include 3 #include 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 }
因為是多組數據,所以不要忘了數組重置。