栈/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;

}

你可能感兴趣的:(poj)