栈/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;
}
posted on 2011-06-04 10:21  yangyh  阅读(404)  评论(0编辑  收藏  举报