• SWUST OJ 东6宿舍灵异事件(0322)


    东6宿舍灵异事件(0322)

    Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 88 Accepted: 31
     
    Description
    将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信。但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你。 
    提供两种组合方式: 
    A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假 
    A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假 
    优先级顺序 “括号”>“&”>“|” 
    例如:a&b|(a|b&c),a=真,b=假,c=真; 
    那么上式可以这样转化 
    真&假 | (真|假&真) 
    假 | (真|假) 
    假 | 真 
    真 
     
    Input
    有多组测试数据,每组测试数据共两行,第一行是一个逻辑范式,数据不用判错; 
    接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F); 
     
    Output
    对于每一组数据,输出最终的结果(TRUE or FALSE);
     
    Sample Input
    a&b|(a|b&c)
    T F T
     
    Sample Output
    TRUE
     
    Hint
    SCPC - ChenYi
     
      1 #include<stdio.h>
      2 #include<string.h>
      3  
      4 struct
      5 {
      6     char ch;
      7     int pri;
      8 }lpri[5]={{'=',0},{'(',1},{'+',3},{'*',5},{')',6}},rpri[5]={{'=',0},{'(',6},{'+',2},{'*',4},{')',1}};
      9  
     10 void Change(char *a)
     11 {
     12     if(*a=='T')
     13         *a='1';
     14     else
     15         *a='0';
     16 }
     17  
     18 void Transform(char exp[],char a,char b,char c)
     19 {
     20     int len,i;
     21     len=strlen(exp);
     22     for(i=0;i<len;i++)
     23     {
     24         if(exp[i]=='a')
     25             exp[i]=a;
     26         if(exp[i]=='b')
     27             exp[i]=b;
     28         if(exp[i]=='c')
     29             exp[i]=c;
     30         if(exp[i]=='&')
     31             exp[i]='*';
     32         if(exp[i]=='|')
     33             exp[i]='+';
     34     }
     35 }
     36  
     37 int Lpri(char ch)
     38 {
     39     int i;
     40     for(i=0;i<5;i++)
     41     {
     42         if(ch==lpri[i].ch)
     43         {
     44             return lpri[i].pri;
     45         }
     46     }
     47 }
     48  
     49 int Rpri(char ch)
     50 {
     51     int i;
     52     for(i=0;i<5;i++)
     53     {
     54         if(ch==rpri[i].ch)
     55         {
     56             return rpri[i].pri;
     57         }
     58     }
     59 }
     60  
     61 void expTOpostexp(char exp[],char postexp[])
     62 {
     63     int len,top=-1,t=0,i;
     64     char op[100];
     65     len=strlen(exp);
     66     for(i=0;i<len;)
     67     {
     68         if(exp[i]=='0'||exp[i]=='1')
     69         {
     70             postexp[t++]=exp[i++];
     71         }
     72         else
     73             if(Lpri(op[top])<Rpri(exp[i])||top==-1)//最开始栈顶是 -1
     74             {
     75                 op[++top]=exp[i++];
     76             }
     77             else
     78                 if(Lpri(op[top])>Rpri(exp[i]))
     79                 {
     80                     postexp[t++]=op[top--];
     81                 }
     82                 else
     83                     if(Lpri(op[top])==Rpri(exp[i]))
     84                     {
     85                         top--;
     86                         i++;
     87                     }
     88     }
     89     for(i=top;i>-1;i--)//top就是栈顶的指针
     90     {
     91         postexp[t++]=op[top--];
     92     }
     93     postexp[t]='';
     94     //printf("postexp:%s
    ",postexp);
     95 }
     96  
     97 int Judge(char postexp[])
     98 {
     99     int top=-1,len,i,num[100],a,b;
    100     len=strlen(postexp);
    101     for(i=0;i<len;i++)
    102     {
    103         if(postexp[i]=='0'||postexp[i]=='1')
    104             num[++top]=postexp[i]-'0';
    105         if(postexp[i]=='+')
    106         {
    107             a=num[top--];
    108             b=num[top];
    109             num[top]=a+b;
    110         }
    111         if(postexp[i]=='*')
    112         {
    113             a=num[top--];
    114             b=num[top];
    115             num[top]=a*b;
    116         }
    117     }
    118     return num[0];
    119 }
    120  
    121 int main()
    122 {
    123     char exp[100],postexp[100];
    124     char a,b,c;
    125     while(scanf("%s",exp)!=EOF)
    126     {
    127         getchar();
    128         scanf("%c",&a);
    129         getchar();
    130         scanf("%c",&b);
    131         getchar();
    132         scanf("%c",&c);
    133         Change(&a);
    134         Change(&b);
    135         Change(&c);
    136         Transform(exp,a,b,c);
    137         //printf("exp:%s
    ",exp);
    138         expTOpostexp(exp,postexp);
    139         if(Judge(postexp))
    140             printf("TRUE
    ");
    141         else
    142             printf("FALSE
    ");
    143     }
    144     return 0;
    145 }

    注:与运算可以看成是 *(乘法),或运算可看成是 +(加法),FALSE=0 TRUE=1,中缀表达式变后缀表达式并求值。

  • 相关阅读:
    转载 轻松搞定面试中的二叉树题目
    关于AVplayer 缓冲问题的处理
    关于iOS接收到推送消息后跳转问题
    iOS 黑魔法
    UITableView的优化
    OC是动态运行时语言是什么意思?什么是动态识别,动态绑定?
    iOS深复制和浅复制
    iOS内存管理(ARC,MRC)
    iOS数据持久化
    详解KVO,KVC
  • 原文地址:https://www.cnblogs.com/haveyoueverbeen/p/4469959.html
Copyright © 2020-2023  润新知