倒这做比较方便,通过元素进栈,元素符号取出栈中元素做运算再放回栈中即可实现。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
char str[150];
int q, p, s, t, r;
int stack[150];
void view()
{
int top = -1;
int len = strlen(str);
for(int i = len-1;i >=0;i--){
if(str[i] == 'q') stack[++top] = q;
else if(str[i] == 'p') stack[++top] = p;
else if(str[i] == 's') stack[++top] = s;
else if(str[i] == 't') stack[++top] = t;
else if(str[i] == 'r') stack[++top] = r;
else if(str[i] == 'K'){
bool x = stack[top--];
bool y = stack[top--];
stack[++top] = x&&y;
}else if(str[i] =='A'){
bool x = stack[top--];
bool y = stack[top--];
stack[++top] = x||y;
}else if(str[i] == 'N'){
stack[top] = !stack[top];
}else if(str[i] == 'C'){
bool x = stack[top--];
bool y = stack[top--];
if(x == 1&&y==0) stack[++top] = 0;
else stack[++top] = 1;
}else if(str[i] == 'E'){
bool x = stack[top--];
bool y = stack[top--];
if((x==1&& y== 1)||(x==0&&y==0)) stack[++top] = 1;
else stack[++top] = 0;
}
}
}
bool solve()
{
for(q = 0;q < 2;q++)
for(p = 0;p < 2;p++)
for(s = 0;s < 2;s++)
for(t = 0;t < 2;t++)
for(r = 0;r < 2;r++){
view();
if(stack[0] == 0)
return false;
}
return true;
}
int main()
{
while(cin >> str){
if(strcmp(str,"0") == 0){
break;
}
if(solve()){
printf("tautology\n");
}else {
printf("not\n");
}
}
return 0;
}