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]='\0';
 94     //printf("postexp:%s\n",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\n",exp);
138         expTOpostexp(exp,postexp);
139         if(Judge(postexp))
140             printf("TRUE\n");
141         else
142             printf("FALSE\n");
143     }
144     return 0;
145 }

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

posted on 2015-04-30 21:52  _飛  阅读(403)  评论(0编辑  收藏  举报

导航