[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=真; 
那么上式可以这样转化 
真&假 | (真|假&真) 
假 | (真|假) 
假 | 真 
真 
 
 
Input
有多组测试数据,每组测试数据共两行,第一行是一个逻辑范式,数据不用判错; 
接下来三个字符,以空格隔开,分表代表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 }
View Code

 

 
posted @ 2015-06-16 19:04  繁夜  阅读(367)  评论(0编辑  收藏  举报