本人比较懒,只写了能够支持 且、或、非 的程序
不过命题数可为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;
}