栈/POJ2395(判断是否为恒真式)
题目:
p q r s t是变量
N表示非:如Nr
E表示是否相等:如Ers = r==s
A表示或:如Ars = r||s
K表示与:如Krs = r&&s
C表示推导:Crs= !r || s
算法:
只有5个变量,枚举0~31,每位分别是p q r s t的值,看每次计算的值是不是true
从字符串结尾开始入栈:
是变量则入栈
是操作符则出栈计算完成后再入栈
最后看栈顶就可以了
Sample Input
ApNp
ApNq
0
Sample Output
tautology
not
#include <stack> using namespace std; int main(int argc, char* argv[]) { //freopen("i:\\t.txt","r",stdin); char str[128]; bool val[5]; bool t,t1,t2; memset(val,false,sizeof(val)); while(scanf("%s",str)!=EOF){ if(!strcmp(str,"0"))return 1; stack<bool> st; for(int v = 0; v<32;v++){ for(int k = 0;k<5;k++) val[k]=(v>>k)&1; for(int i=strlen(str)-1;i>=0;i--){ switch(str[i]){ case 'p': case 'q': case 'r': case 's': case 't': st.push(val[str[i]-'p']); break; case 'N': t = st.top(); st.pop(); st.push(!t); break; case 'E': t1=st.top(); st.pop(); t2=st.top(); st.pop(); st.push(t1==t2); break; case 'A': t1=st.top(); st.pop(); t2=st.top(); st.pop(); st.push(t1||t2); break; case 'K': t1=st.top(); st.pop(); t2=st.top(); st.pop(); st.push(t1 && t2); break; case 'C': t1=st.top(); st.pop(); t2=st.top(); st.pop(); st.push(t1 || !t2); break; } } if(!st.top())break; } if(!st.top())printf("not\n"); else printf("tautology\n"); } return 1; }
躲猫猫社团团长 http://t.sina.com.cn/coolria