[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

 

 

你可能感兴趣的:(表达式)