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

本文介绍了一种自创的奇葩递归方法,用于解析和计算复杂的布尔表达式。通过递归处理括号优先级、逻辑非、与及或运算,实现了对输入布尔表达式的有效求值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值