2017-10-05
题目大意:
以K、A、N、C、E定义了5种逻辑操作,p、q、r、s、t是5个逻辑变量。给出若干由这10个字符组成的字符串(长度不超过100字符),如:ApNp,判断这个字符串表示的逻辑函数是否为重言式(即无论其中逻辑变量取值为何,表达式的值都为真),是则输出”tautology”,不是则输出”not”。
样例输入:
ApNp
ApNq
0
样例输出:
tautology
not
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <map>
using namespace std;
map<char,int> Map;
//判断是否为重言式
bool jud(char *iput,int p, int q, int r, int s, int t) {
stack<int> opNum;
int op1,op2;
//从后往前处理输入的字符串
for(int i = strlen(iput) - 1; i >= 0; i--) {
//需要两个操作数的操作
if(iput[i] == 'K' || iput[i] == 'A' || iput[i] == 'C' || iput[i] == 'E') {
op1 = opNum.top(); opNum.pop();
op2 = opNum.top(); opNum.pop();
switch(iput[i]) {
case 'K':
opNum.push(op1 && op2); break;
case 'A':
opNum.push(op1 || op2); break;
case 'C':
opNum.push((op1 && op2) || !op1); break;
case 'E':
opNum.push(op1 == op2); break;
}
}
//只要一个操作数的“非”操作
else if(iput[i] == 'N') {
op1 = opNum.top(); opNum.pop(); opNum.push(!op1);
}
//操作数
else
opNum.push(Map[iput[i]]);
}
return opNum.top() == 1 ? true : false;
}
int main() {
char iput[110];
while(scanf("%s",iput), iput[0] != '0') {
bool flag = true;
for(int p = 0; p <=1 && flag; p++) {
Map['p'] = p;
for(int q = 0; q <= 1 && flag; q++) {
Map['q'] = q;
for(int r = 0; r <= 1 && flag; r++) {
Map['r'] = r;
for(int s = 0; s <= 1 && flag; s++) {
Map['s'] = s;
for(int t = 0; t <= 1 && flag; t++) {
Map['t'] = t;
//是否为重言式,一旦出现为0即跳出
flag = jud(iput,p,q,r,s,t);
}
}
}
}
}
if(flag) printf("tautology\n");
else printf("not\n");
}
return 0;
}