难以获得正确的结果 缀:(A + B)/(C-D)后缀:AB + CD- /
我不断收到Postfix:AB + C / D-
我确实知道问题出在它不能在推入'('之前从栈中弹出最后一个运算符。这就是为什么我在第一个else if条件中添加了if语句的原因。这也不起作用。我到底在做错什么呢?还有另一种方法来解决这个问题吗?
#include <iostream>
#include <stack>
#include <sstream>
#include <string>
using namespace std;
int precedence(char x) {
int op;
if (x == '(' || x==')')
op = 1;
else if (x == '^')
op = 2;
else if (x == '*')
op = 3;
else if ( x == '/')
op = 4;
else if (x == '+')
op = 5;
else if (x == '-')
op = 6;
return op;
}
int main()
{
string getInfix;
cout << "Infix: ";
getline(cin, getInfix);
stack<char> opStack;
stringstream showInfix;
for (unsigned i = 0; i < getInfix.length(); i++)
{
if (getInfix[i] == '+' || getInfix[i] == '-' || getInfix[i] == '*' || getInfix[i] == '/' || getInfix[i] == '^')
{
while (!opStack.empty() && precedence(opStack.top() <= precedence(getInfix[i]))
{
showInfix << opStack.top();
opStack.pop();
}
opStack.push(getInfix[i]);
}
else if (getInfix[i] == '(')
{
opStack.push(getInfix[i]);
opStack.pop();
if (getInfix[i]=='(' && !opStack.empty())
{
opStack.push(getInfix[i]);
opStack.pop();
}
}
else if (getInfix [i]==')')
{
showInfix << opStack.top();
opStack.pop();
}
else
{
showInfix << getInfix[i];
}
}
while (!opStack.empty())
{
showInfix << opStack.top();
opStack.pop();
}
cout << "Postfix: "<<""<<showInfix.str() << endl;
cin.ignore ( numeric_limits< streamsize >:: max(),'\n');
return 0;
}
答案 0 :(得分:1)
您没有设置op
const int precedence(const char x) noexcept(true) {
switch (x) {
case '(': case ')':
return 1;
case '^':
return 2;
case '*':
return 3;
case '/':
return 4;
case '+':
return 5;
case '-':
return 6;
}
return -1;
}
它返回-1,但我让您找出该部分。 它没有回答问题。 看到您可能正在读取垃圾值之后,我才停了下来。
答案 1 :(得分:1)
问题来自此行(!opStack.empty() && precedence(opStack.top() <=precedence(getInfix[i]))
您正在弹出找到的最后一个运算符,而不检查是否在括号语句中。在将运算符添加到输出字符串之前,需要考虑括号字符。
与您的问题无关,但有一些建议:
push
或pop
字符,请勿先(
然后再)
,就像忽略它们一样。)
,我想这是复制/粘贴问题:while (!opStack.empty() && precedence(opStack.top() <=precedence(getInfix[i]))
(
和)
的优先级,但是您实际上从未使用那种字符来调用该方法吗?