我创建了一个布尔代数简化器。但是,为此,我创建了一个子程序,该程序首先简化了括号并节省了麻烦,然后我决定只在用户输入的表达式的开头和结尾添加括号,然后将其通过子例程传递,以减少所需的代码量
如果整个表达式尚未用括号括起来,我的程序应仅在用户输入的开头和结尾添加括号。例如,
程序将完全保留其表达式:(A+C•B)
。该代码将包含以下表达式:A+C•B
,以使其为:(A+C•B)
。
我检查表达式是否被包围的方法是检查字符串中的第一个字符是否为(以及字符串中的最后一个字符是否为)。这很简单。
但是,在诸如(A+C)•(B+D)
这样的情况下,如您所见,开始字符和结束字符分别是左括号和右括号,但是表达式没有完全用括号括起来。它应该是((A+C)•(B+D))
。
我试图创建一个条件,该条件将允许我实现这种类型的异常,并且仍然将方括号括起来,但是我不确定如何做到。我试过忽略第一个方括号,并为表达式中的每个其他方括号添加一个变量,并为该变量中的每个封闭方括号从变量中减去一个。
这会给-1
表示表达式是否完全包含在内,但也适用于上述情况。我想问问是否有人知道如何检查一个表达式是否完全括在方括号中,从而适用于所有可能性。我想不到一个。
我知道没有提供代码,但是由于这个问题,我认为这是一个适合此类网站的问题。
答案 0 :(得分:1)
您提供了有关确切实现的有限信息,但是我假设您的表达式在字符串中。
如果您考虑这个问题,可以归结为检查表达式中最后一个字符之前的第一个方括号是否“关闭”。
public static bool IsFullyEncased(string expression)
{
if (expression.Length > 1 && expression[0] == '(' && expression[expression.Length-1] == ')')
{
// Candidate for a fully enclosed expression: ( .* )
int openBracketCount = 1;
for (int i = 1; i < expression.Length - 1; ++i)
{
switch (expression[i])
{
case '(':
openBracketCount += 1;
break;
case ')':
openBracketCount -= 1;
break;
}
// Additionally checks for valid expression (in terms of brackets)
if (openBracketCount <= 0) return false;
}
// The last element is a bracket so we must have only 1 open
if(openBracketCount == 1) return true;
}
return false;
}
通过一些测试(带有有效的表达式)查看实际运行情况:https://ideone.com/44KV5F