中缀的前缀不能完全给出正确的结果

时间:2014-02-08 03:04:19

标签: c++ algorithm

我有一个非常简单的算法,它接受一个RPN字符串并将其转换为中缀:

   for(unsigned int i = 0; i < tokens.size(); i++)
    {
        token = tokens[i];

        if(!isOperator(token))
        {
            stack.push(token);
        }
        else
        {
            //need at least 2 values
            string a = stack.pop();
            string b = stack.pop();
            string expr = "(" + a + token + b + ")";
            stack.push(expr);
        }
    }

string converted = stack.pop();

但是,我的RPN字符串中也有指数。

以下是RPN示例:

3 4 2 * 1 5 - 2 3 ^ ^ / +

Infix看起来像:

(3+((4*2)/((1-5)^(2^3))))

这是正确的。

我将其修改为使用前缀:

for(int i = tokens.size() - 1; i >= 0; i--)
    {
        token = tokens[i];

        if(!isOperator(token))
        {
            stack.push(token);
        }
        else
        {
            //need at least 2 values
            string a = stack.pop();
            string b = stack.pop();
            string expr = "(" + a + token + b + ")";
            stack.push(expr);
        }
    }

但它的结果略有不同:

给出前缀:

+ 3 * 4 / 2 ^ ^ - 1 5 2 3

我得到了中缀:

(3+(4*(2/(((1-5)^2)^3))))

哪个稍有不妥。我不确定为什么4乘以表达式的另一部分而不是2。

有人能指出我可能出错的地方吗?

由于

1 个答案:

答案 0 :(得分:1)

您的算法是正确的。您的测试输入错误会得到错误的答案。

相应中缀的前缀应为

+ 3 / * 4 2 ^ - 1 5 ^ 2 3

我所参考的有关prefix notation(波兰表示法)的信息。