• 布尔表达式


    时间限制: 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 }

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

  • 相关阅读:
    Oracle Scheduler Postponed job
    MySQL字符集问题
    LogMiner的一个案例
    Oracle Scheduler NLS_ENV
    ORA01555的模拟
    在线重定义 Oracle Redefinition
    MySQL Proxy 读写分离
    SQL判断分段的连续值
    基础复习之.net中new关键字的用法
    VB与C#相互转换
  • 原文地址:https://www.cnblogs.com/J-william/p/6194510.html
Copyright © 2020-2023  润新知