首页 > 其他 > 详细

poj3295解题报告(构造、算术表达式运算)

时间:2014-06-02 08:28:09      阅读:328      评论:0      收藏:0      [点我收藏+]

 

POJ 3952,题目链接http://poj.org/problem?id=3295

题意:

输入由pqrstKANCE10个字母组成的逻辑表达式,

其中pqrst的值为1true)或0false),即逻辑变量;

KANCE为逻辑运算符,

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^50x1f)种情况。

代码:

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

poj3295解题报告(构造、算术表达式运算)

原文:http://www.cnblogs.com/songcf/p/3763651.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!