poj 2106 Boolean Expressions(字符串bool表达式求值)

来源:互联网 发布:吸血臭虫 知乎 编辑:程序博客网 时间:2024/06/11 22:41

自创奇葩递归写法~~~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;    }}

原创粉丝点击