在后缀表达式中评估“-1 + 2”

问题描述

我正在编写一个解析器以验证infix表达式是否正确,然后从中构建一棵树(可以从该树中计算出,也可以轻松地转换为前缀/后缀)。到目前为止还不错,直到我遇到诸如-(1+2)-{[-(1+2)*3]-4}之类的表达式。

  1. 这些表达式有效吗?我是否需要将其转换为-1*(1+2)-1+-2(如果表达式太长,可能会很难)?
  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 (将#修改为@)