POJ 3295 Tautology 永真式,栈的简单模拟

来源:互联网 发布:mac editplus 编辑:程序博客网 时间:2024/05/21 14:49
倒这做比较方便,通过元素进栈,元素符号取出栈中元素做运算再放回栈中即可实现。
#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;}

0 0