自创奇葩递归写法~~~23333
题目链接:点击打开链接
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
//优先级~
//1.括号
//2.NOT
//3.AND
//4.OR0
//5.从左往右(!是从右往左~)
string replacesub(string exp,int s,int ls,string sub)
{
return exp.substr(0,s)+sub+exp.substr(s+ls,exp.size()-s-ls);
}
bool booleanexp(string exp)
{
for(int i=0;i<exp.size();i++)
{
if(exp[i]=='(')
{
int bsz=1;
int ls=1;
while(bsz)
{
if(exp[i+ls]=='(') bsz++;
else if(exp[i+ls]==')') bsz--;
ls++;
}
string subexp=exp.substr(i+1,ls-2);
exp=replacesub(exp,i,ls,booleanexp(subexp)?"1":"0");
}
}
for(int i=exp.size()-1;i>=0;i--)
if(exp[i]=='!')
exp=replacesub(exp,i,2,exp[i+1]=='1'?"0":"1");
for(int i=0;i<exp.size();i++)
if(exp[i]=='&')
exp=replacesub(exp,i-1,3,(exp[i-1]=='1'&&exp[i+1]=='1')?"1":"0"),i--;
for(int i=0;i<exp.size();i++)
if(exp[i]=='|')
{
exp=replacesub(exp,i-1,3,(exp[i-1]=='1'||exp[i+1]=='1')?"1":"0"),i--;
}
return exp=="1";
}
int main()
{
int nofcase=1;
string reg;
while(getline(cin,reg))
{
string check;
for(int i=0;i<reg.size();i++)
{
if(reg[i]==' ') continue;
else if(reg[i]=='V') check+='1';
else if(reg[i]=='F') check+='0';
else check+=reg[i];
}
//cout<<"check :"<<check<<endl;
cout<<"Expression "<<nofcase++<<": "<<(booleanexp(check)?'V':'F')<<endl;
}
}