数理逻辑 3.8习题 15,16

本人比较懒,只写了能够支持 且、或、非 的程序

不过命题数可为1~26,命题用大写的A~Z表示

Code

#include 
using namespace std;
typedef long long ll;
int R(){int a=0,b=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')b=-1;c=getchar();}while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}return a*b;}
string s;
map M;
stack op;
stack v;
vector X;
bool pri(char a,char b){//a优先级小于b 
	if(a==')')return b!='(';
	if(b=='!'&&a!='(')return 1;
	return 0;
}
void work(){
	char o=op.top();op.pop();
	switch (o){
		case '^':{
			bool l1=v.top();
			v.pop();
			bool l2=v.top();
			v.pop();
			v.push(l1&&l2);
			break;
		}
		case 'v':{
			bool l1=v.top();
			v.pop();
			bool l2=v.top();
			v.pop();
			v.push(l1||l2);
			break;
		}
		case '!':{
			bool tmp=1-v.top();
			v.pop();
			v.push(tmp);
			break;
		}
	}
}
void init(){
	while(!v.empty())v.pop();
	while(!op.empty())op.pop();
}
bool calc(){
	init();
	for(int i=0;s[i];++i){
		if(s[i]>='A'&&s[i]<='Z'){
			v.push(M[s[i]]);
		}else{
			while(!op.empty()&&pri(s[i],op.top())){//op非空且当前运算符优先级小于栈顶运算符 
				work();
			}
			if(s[i]==')')op.pop();//弹掉左括号 
			else op.push(s[i]);
		}
	}
	while(!op.empty())work();
	return v.top();
}
int len;
void dfs(int now){
	if(now==len){
		for(int i=0;i>s;
	for(int i=0;s[i];++i){
		if(s[i]>='A'&&s[i]<='Z'){
			bool find=0;
			for(int j=0;j

运行截图

数理逻辑 3.8习题 15,16_第1张图片数理逻辑 3.8习题 15,16_第2张图片

你可能感兴趣的:(课内,c++)