中缀到后缀 - 删除括号

时间:2015-04-29 06:44:35

标签: c++ stack

无法从字符串中弹出括号。 我输入了一个中缀表达式,例如(A+B)*C,并希望获得AB+C*。 相反,我得到(AB)+C*。任何帮助将不胜感激。

 string Postfx::convertToPostfix(Postfx C,string in)
    {
    stack<char> S;
    string postfx = "";



    for (int i = 0; i<in.length();i++)
    {
        if (in[i] == ' ' || in[i] == ',') continue;

        else if ((in[i]) == '+' || in[i] == '-' || in[i] == '/' || in[i] == '*')
        {
            while (!S.empty() && S.top() != '(' && C.precedence(S.top(), in[i]))
            {
                postfx += S.top();
                S.pop();
            }
            S.push(in[i]);
        }

        else if ((in[i]) != '+' || in[i] != '-' || in[i] != '/' || in[i] != '*')
        {
            postfx += in[i];
        }

        else if (in[i] == '(')
        {
            S.push(in[i]);
        }
        else if (in[i] == ')')
        {
            while (!S.empty() && S.top() != '(')
            {
                postfx += S.top();
                S.pop();
            }
            S.pop();
        }
    }

    while (!S.empty()) {
        postfx += S.top();
        S.pop();
    }

    return postfx;
}

2 个答案:

答案 0 :(得分:1)

我认为你的

else if ((in[i]) != '+' || in[i] != '-' || in[i] != '/' || in[i] != '*')

行也会捕获括号,所以

else if (in[i] == '(')

以下永远不会被执行。

我认为你应该搬家

else if ((in[i]) != '+' || in[i] != '-' || in[i] != '/' || in[i] != '*')

是链式if中的最后一个选项。

此外,此if完全捕获任何符号(因为任何符号不等于'+',或者不等于'-')。您需要将||替换为&&;但是如果你无论如何都会将if最后一个链接起来,那么你根本不需要任何条件,例如:

if ((in[i] == ' ')|| ...
else if ((in[i] == '+')|| ...
else if (in[i] == '(') ...
else if (in[i] == ')') ...
else postfx += in[i]; // no condition here

P.S。此外,如果您将初始表达式包装在括号中:

in = "(" + in + ")"
在循环之前

,您将不需要最后的while (!S.empty())循环。

答案 1 :(得分:0)

不要将括号附加到输出。它们只是在堆栈中指导您的行为。我不知道你在哪里得到这段代码,但你需要好好看看Dijkstra Shunting-yard algorithm。你的版本在几个方面与它不匹配,其中一些甚至没有意义:

if (in[i] != '+' || in[i] != '-' || in[i] != '/' || in[i] != '*')