问题描述
我正在编写一个解析器以验证infix表达式是否正确,然后从中构建一棵树(可以从该树中计算出,也可以轻松地转换为前缀/后缀)。到目前为止还不错,直到我遇到诸如-(1+2)
,-{[-(1+2)*3]-4}
之类的表达式。
- 这些表达式有效吗?我是否需要将其转换为
-1*(1+2)
或-1+-2
(如果表达式太长,可能会很难)? - 如果是,后缀应该为
1 2 + -
还是-1 1 2 + *
?
我认为1 2 + -
不是有效的树,因为1 2 + -
-> 3 -
没有左节点。
这是我的代码:
bool validate(const std::string &str)
{
bool afterNum = false;
std::stack<int> bracketType;
for (auto i = str.begin(); i != str.end(); ++i)
{
if (isspace(*i))
continue;
//after a number can only be an operator or an open bracket
else if (afterNum)
{
if (int bracket = isCloseBracket(*i))
{
if (!bracketType.empty() && bracket == bracketType.top())
bracketType.pop();
else
return false;
}
else if (isOperator(*i))
afterNum = false;
else
return false;
}
else if (int bracket = isOpenBracket(*i))
{
if (bracketType.empty()
|| (!bracketType.empty() && bracket <= bracketType.top()))
bracketType.push(bracket);
else
return false;
}
else if (isdigit(*i))
{
bool foundDot = false;
for (; i != str.end(); ++i)
{
if (*i == '.')
if (foundDot == false)
foundDot = true;
else
return false;
else if (!isdigit(*i))
break;
}
--i;
if (*i == '.')
return false;
afterNum = true;
}
else
return false;
}
if (!bracketType.empty())
return false;
return true;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)