POJ 3295 Tautology
该题是表达式的前序表达,如果从后面往前遍历,即为后序表达,所以用stack的方式即可求值。模拟p,q,r,s,t 可能出现的32种情况,如果全为1,则表达式值恒为1,反之亦然。
Code:
1 #include <iostream>
2 #include <stack>
3 using namespace std;
4
5 int main()
6 {
7 char p[101];
8 stack<bool>s;
9 bool f[5], op, flag;
10
11 while (scanf("%s",p) && p[0] != '0')
12 {
13 flag = true;
14 for (int i = 0; (i < 32) && flag; i++)
15 {
16 for (int j = 0; j < 5; j++)
17 {
18 if (i&(1<<j))f[j] = true;
19 else f[j] = false;
20 }
21 for (int i = strlen(p) - 1; i >= 0; i--)
22 {
23 switch (p[i])
24 {
25 case 'K':
26 op = s.top(); s.pop();
27 op = op & s.top(); s.pop();
28 break;
29 case 'A':
30 op = s.top(); s.pop();
31 op = op | s.top(); s.pop();
32 break;
33 case 'N':
34 op = s.top(); s.pop();
35 op = !op;
36 break;
37 case 'C':
38 op = s.top(); s.pop();
39 op = (!op)|s.top(); s.pop();
40 break;
41 case 'E':
42 op = s.top(); s.pop();
43 op = !(op^s.top()); s.pop();
44 break;
45 default:
46 op = f[p[i]-'p'];
47 }
48 s.push(op);
49 }
50 if (!s.top())flag = false;
51 s.pop();
52 }
53 flag ? printf("tautology\n") : printf("not\n");
54 }
55 return 0;
56 }
浙公网安备 33010602011771号