数理逻辑 3.8习题 15,16

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

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

Code

#include <bits/stdc++.h>
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<char,bool> M;
stack<char> op;
stack<bool> v;
vector<char> 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<len;++i){
			printf("%d\t",M[X[i]]);
		}
		printf("%d\n",calc());
		return;
	}
	M[X[now]]=1;
	dfs(now+1);
	M[X[now]]=0;
	dfs(now+1);
}
int main(){
	cout<<"说明:\n命题数可为1~26\n命题用大写的A~Z表示\n本程序支持以下逻辑运算:\n————————\n且 ^\n或 v(小写v)\n非 !\n(且和或并列时请加括号)\n————————\n请输入您的逻辑表达式:\n"; 
	cin>>s;
	for(int i=0;s[i];++i){
		if(s[i]>='A'&&s[i]<='Z'){
			bool find=0;
			for(int j=0;j<X.size();++j){
				if(s[j]==s[i])find=1;
			}
			if(!find){
				X.push_back(s[i]);
				printf("%c\t",s[i]);
			}
		}
	}
	cout<<s<<'\n';
	len=X.size();
	dfs(0);
	return 0;
}

运行截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值