[Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)
题目链接:http://acm.swust.edu.cn/problem/322/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
将军听说最近东6闹鬼了,作为一个无神论者,将军当然不相信。但是这个传言已经泛滥了,许多人都在说这个事情,将军从每个人那里听到一个传言,将军可以容易的就知道这个传言是真还是假,但是当一大堆消息组合起来,将军就不知道了,所以将军就找到了你。
提供两种组合方式:
A&B:代表A和B都为真的时候,A和B组合起来为真,否则为假
A|B:代表A和B里面至少有1个为真的时候,A和B组合起来为真,否则为假
优先级顺序 “括号”>“&”>“|”
例如:a&b|(a|b&c),a=真,b=假,c=真;
那么上式可以这样转化
真&假 | (真|假&真)
假 | (真|假)
假 | 真
真
提供两种组合方式:
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);
接下来三个字符,以空格隔开,分表代表a,b,c的真假(T/F);
Output
对于每一组数据,输出最终的结果(TRUE or FALSE);
Sample Input
a&b|(a|b&c))
T F T
|
Sample Output
TRUE |
SCPC - ChenYi
解题思路:更具a,b,c是否为真将其转换为1,0,再把中缀表达式转化为后缀表达式 ’|‘ 运算看做'+',把’&‘运算看做'*',然后看最后的结果就是~~~
代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<stack> 4 using namespace std; 5 char s[10001], v[10001], a, b, c; 6 void get_val(char &x){ 7 if (x == 'T') 8 x = '1'; 9 else 10 x = '0'; 11 } 12 int judge(char x, char y){ 13 if (x == '(') return -1; 14 if (x == '+') 15 return y == '*' ? -1 : 0; 16 if (x == '*') 17 return y == '+' ? 1 : 0; 18 } 19 void change(){ 20 stack<char> Q; 21 int i, k = 0; 22 for (i = 0; s[i] != '\0'; i++){ 23 if (s[i] == '(') 24 Q.push(s[i]); 25 else if (s[i] == ')'){ 26 while (Q.top() != '('){ 27 v[k++] = Q.top(); 28 Q.pop(); 29 } 30 Q.pop(); 31 } 32 else{ 33 if (s[i] != '*'&&s[i] != '+') 34 v[k++] = s[i]; 35 else{ 36 while (!Q.empty() && judge(Q.top(), s[i]) >= 0){ 37 v[k++] = Q.top(); 38 Q.pop(); 39 } 40 Q.push(s[i]); 41 } 42 } 43 } 44 while (!Q.empty()){ 45 v[k++] = Q.top(); 46 Q.pop(); 47 } 48 v[k] = '\0'; 49 //cout << v << endl; 50 } 51 int get_num(){ 52 stack<int>Q; 53 int i, x, y, val; 54 for (i = 0; v[i] != '\0'; i++){ 55 if (v[i] != '*'&&v[i] != '+') 56 Q.push(v[i] - '0'); 57 else{ 58 x = Q.top(), Q.pop(); 59 y = Q.top(), Q.pop(); 60 switch (v[i]){ 61 case '*':val = x*y; break; 62 case '+':val = x + y; break; 63 } 64 Q.push(val); 65 } 66 } 67 return Q.top(); 68 } 69 void mergy(char *s, char a, char b, char c){ 70 for (int i = 0; s[i] != '\0'; i++){ 71 if (s[i] == 'a')s[i] = a; 72 if (s[i] == 'b')s[i] = b; 73 if (s[i] == 'c')s[i] = c; 74 if (s[i] == '&')s[i] = '*'; 75 if (s[i] == '|')s[i] = '+'; 76 } 77 } 78 int main(){ 79 while (cin >> s){ 80 cin >> a >> b >> c; 81 get_val(a), get_val(b), get_val(c); 82 mergy(s, a, b, c); 83 change(); 84 cout << (get_num() > 0 ? "TRUE\n" : "FALSE\n"); 85 } 86 return 0; 87 }
如果这是你所爱的,就不要让自己后悔~~~