POJ 3952,题目链接http://poj.org/problem?id=3295
输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,
其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;
K、A、N、C、E为逻辑运算符,
K --> and: x && y
A --> or: x || y
N --> not : !x
C --> implies : (!x)||y
E --> equals : x==y
输入格式保证是合法的,问这个逻辑表达式是否为永真式。
1. 从输入字符串末尾向前读取字符,构造一个栈,遇到pqrst则入栈,遇到N则取出栈顶一个值计算后入栈,遇到KACE则取栈顶两个值计算后入栈。最后栈内将只剩一个值,即该表达式的值。(与用栈计算算术表达式的方式一样)
2. 一个5个逻辑变量,每种情况都要考虑,那么一共2^5(0x1f)种情况。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 |
//560K 0MS#include <cstdio>#include <cstring>#include <stack>using
std::stack;//K, A, N, C, E //逻辑符号//p, q, r, s, t //bool值char
buf[101];stack<bool> s_stack;bool
data[5]={false};bool
WFF(char* str, int
val){ //init p q r s t for
(int i=0; i<5; ++i){ data[i] = (1<<i) & val; } while
(! s_stack.empty()) s_stack.pop(); int
strLen = strlen(str); bool
a,b; while
(--strLen >= 0) { switch
(buf[strLen]) { case
‘p‘: s_stack.push(data[0]); break; case
‘q‘: s_stack.push(data[1]); break; case
‘r‘: s_stack.push(data[2]); break; case
‘s‘: s_stack.push(data[3]); break; case
‘t‘: s_stack.push(data[4]); break; case
‘K‘: a=s_stack.top(); s_stack.pop(); b=s_stack.top(); s_stack.pop(); s_stack.push(a && b); break; case
‘A‘: a=s_stack.top(); s_stack.pop(); b=s_stack.top(); s_stack.pop(); s_stack.push(a || b); break; case
‘N‘: a=s_stack.top(); s_stack.pop(); s_stack.push(!a); break; case
‘C‘: a=s_stack.top(); s_stack.pop(); b=s_stack.top(); s_stack.pop(); s_stack.push(!a || b); break; case
‘E‘: a=s_stack.top(); s_stack.pop(); b=s_stack.top(); s_stack.pop(); s_stack.push(a == b); break; default: break; } } return
s_stack.top();}int
main(){ while
(true) { memset(buf, 0, sizeof(char)*101); scanf("%s", buf); if
(strcmp(buf, "0") == 0) break; bool
tautology = true; for
(int val=0; val<=0x1f; ++val) { if
(! WFF(buf, val)){ tautology = false; break; } } if
(tautology){ printf("tautology\n"); }else
{ printf("not\n"); } } return
0;} |
poj3295解题报告(构造、算术表达式运算),布布扣,bubuko.com
原文地址:http://www.cnblogs.com/songcf/p/3763651.html