想让你的离散计算变轻松吗???
来这里吧----
支持:( ) 括号,| 析取 ,& 合取 ,! 否定 , > 条件-------暂不支持“ < > ” 双条件
注意: 符号请按上面的输入--合式P,Q 请直接输入0或1,合式公式中无空格0.0
想要带空格可以自己稍微修改一下-.-
代码:
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
using namespace std;
bool fafe;
int ll,i;
char ch[1000];
int suan(int a,char b,int c)
{
if (b=='>')
{
if (a&&!c)
return 0;
else
return 1;
}
if (b=='|')
return a|c;
else
return a&c;
}
int hao()
{
stack<int> shu;
stack<char> fu;
int x;char cc;
i++;
for (;ch[i]!=')';i++)
{
if (ch[i]=='(')
int lp=hao();
if (!fafe)
break;
if (ch[i]=='0'||ch[i]=='1'||ch[i]==')')
{
if (ch[i]!=')')
x=ch[i]-'0';
if (!fu.empty())
{
while (!fu.empty())
{
cc=fu.top();
fu.pop();
if (cc=='!')
{
x=!x;
if (fu.empty())
shu.push(x);
}
else
{
if (!shu.empty())
{
int a=shu.top();
shu.pop();
a=suan(a,cc,x);
shu.push(a);
}
else
fafe=false;
break;
}
}
}
else
shu.push(ch[i]-'0');
}
else
fu.push(ch[i]);
}
// printf("%d %d 66\n",fu.size(),shu.size());
if (!fu.empty()||shu.size()!=1)
{
fafe=false;
return 0;
}
else
return shu.top();
}
int main()
{
while (~scanf("%s",ch))
{
fafe=true;
ll=strlen(ch);
stack<int> shu;
stack<char> fu;
int x;char cc;
for (i=0;i<ll;i++)
{
if (ch[i]=='(')
x=hao();
if (!fafe)
break;
if (ch[i]=='0'||ch[i]=='1'||ch[i]==')')
{
if (ch[i]!=')')
x=ch[i]-'0';
if (!fu.empty())
{
while (!fu.empty())
{
cc=fu.top();
fu.pop();
if (cc=='!')
{
x=!x;
if (fu.empty())
shu.push(x);
}
else
{
if (!shu.empty())
{
int a=shu.top();
shu.pop();
a=suan(a,cc,x);
shu.push(a);
}
else
fafe=false;
break;
}
}
}
else
shu.push(ch[i]-'0');
}
else
fu.push(ch[i]);
}
// printf("%d %d\n",fu.size(),shu.size());
if (!fu.empty()||shu.size()!=1)
{
//printf("%c 99\n",fu.top());
fafe=false;
}
if (fafe)
printf("%d\n",shu.top());
else
printf("这不是一个合式\n");
}
return 0;
}
/*
1&(0&1)
*/