无法从字符串中弹出括号。
我输入了一个中缀表达式,例如(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;
}
答案 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] != '*')