C# 多个(长)真/假字符串的逻辑处理

C# 多个(长)真/假字符串的逻辑处理,c#,logic,C#,Logic,大家好 我正在调用一个字符串的函数,该字符串的长度可达2000个字符,如下所示 cB = "-(1/0)+((1+1)/-(0+0+1)+1)" cB = "0+(1/0/1)+(1/0/0/0/0/1)" cB = "1/1/1/1/1/0/0/01/1/0/01/1/00/0/0/1/1/0/0/10" 与: 1:TRUE 0:错 +:逻辑与 /:逻辑或 -:逻辑非 正如您所看到的,它是严格数学的,首先是括号,然后是逻辑AND,最后是逻辑OR 功能是: String cB = cdb.Va

大家好

我正在调用一个字符串的函数,该字符串的长度可达2000个字符,如下所示

cB = "-(1/0)+((1+1)/-(0+0+1)+1)"
cB = "0+(1/0/1)+(1/0/0/0/0/1)"
cB = "1/1/1/1/1/0/0/01/1/0/01/1/00/0/0/1/1/0/0/10"
与:

1:TRUE
0:错
+:逻辑与
/:逻辑或
-:逻辑非

正如您所看到的,它是严格数学的,首先是
括号
,然后是
逻辑AND
,最后是
逻辑OR

功能是:

String cB = cdb.Value
for (int m = 0; m < 10; m++)
        {
            if (cB.Length == 1)
            {
                break;
            }
            else
            {
                cB = cB.Replace("01", "0").Replace("10", "0").Replace("11", "1").Replace("00", "0");
                cB = cB.Replace("-0", "1").Replace("-1", "0");
                cB = cB.Replace("(0)", "0").Replace("(1)", "1").Replace("(-0)", "1").Replace("(-1)", "0");
                for (int n = 0; n < 10; n++)
                {
                    if (!cB.Contains("+"))
                    {
                        break;
                    }
                    cB = cB.Replace("0+0", "0").Replace("1+1", "1").Replace("0+1", "0").Replace("1+0", "0");
                    cB = cB.Replace("(0)", "0").Replace("(1)", "1").Replace("(-0)", "1").Replace("(-1)", "0");
                }
                for (int p = 0; p < 10; p++)
                {
                    if (!cB.Contains("/"))
                    {
                        break;
                    }
                    cB = cB.Replace("0/0", "0").Replace("1/1", "1").Replace("0/1", "1").Replace("1/0", "1");
                    cB = cB.Replace("(0)", "0").Replace("(1)", "1").Replace("(-0)", "1").Replace("(-1)", "0");
                }
            }
        }
        if (cB == "1")
        {
            result = 1;
        }
        else if (cB == "0")
        {
            result = 0;
        }
        else
        {
            result = 9;
        }
String cB=cdb.Value
对于(int m=0;m<10;m++)
{
如果(cB.Length==1)
{
打破
}
其他的
{
cB=cB。替换(“01”,“0”)。替换(“10”,“0”)。替换(“11”,“1”)。替换(“00”,“0”);
cB=cB.替换(“-0”,“1”)。替换(“-1”,“0”);
cB=cB.Replace(“(0)”,“0”)。Replace(“(1)”,“1”)。Replace((-0)”,“1”)。Replace((-1)”,“0”);
对于(int n=0;n<10;n++)
{
如果(!cB.Contains(“+”))
{
打破
}
cB=cB。替换(“0+0”、“0”)。替换(“1+1”、“1”)。替换(“0+1”、“0”)。替换(“1+0”、“0”);
cB=cB.Replace(“(0)”,“0”)。Replace(“(1)”,“1”)。Replace((-0)”,“1”)。Replace((-1)”,“0”);
}
对于(int p=0;p<10;p++)
{
如果(!cB.Contains(“/”)
{
打破
}
cB=cB。替换(“0/0”、“0”)。替换(“1/1”、“1”)。替换(“0/1”、“1”)。替换(“1/0”、“1”);
cB=cB.Replace(“(0)”,“0”)。Replace(“(1)”,“1”)。Replace((-0)”,“1”)。Replace((-1)”,“0”);
}
}
}
如果(cB=“1”)
{
结果=1;
}
否则如果(cB=“0”)
{
结果=0;
}
其他的
{
结果=9;
}
给出的三个字符串的预期结果为: 0 0 一,

我的问题是,这个功能真的很慢。 所以我请求你帮我:)


我忘了提到我是C#

的绝对初学者,我会标记它并避免使用replace。你可以快速得到这个照明,可能低到O(n+guff)到O(n*2),但是这需要一些混乱。最有可能的是,您可以使用Span或unsafe,以及某种fantazmical索引结构。尽管毫无疑问,有一些算法可以实现这一点,也许状态机会有更好的性能。许多数学表达式评估库就在那里。标记化和操作顺序是常见的。他们的代码在GitHub上,这可能是一个很好的灵感。如果你有
00
01
10
11
,它们之间没有操作员,这意味着什么?