C++ 如何接受后缀表达式中的负值
然而,有人提出了类似的问题,但仍然没有答案(至少没有提供代码,尽管建议很好) 与超链接代码不同,我的代码只计算输入的表达式 我无法编造一个逻辑来接受负数。 请注意,在我的代码中,要输入的表达式必须采用正确的后缀格式,并且多位数必须用括号括起来 这是我的密码:C++ 如何接受后缀表达式中的负值,c++,postfix-notation,negative-number,C++,Postfix Notation,Negative Number,然而,有人提出了类似的问题,但仍然没有答案(至少没有提供代码,尽管建议很好) 与超链接代码不同,我的代码只计算输入的表达式 我无法编造一个逻辑来接受负数。 请注意,在我的代码中,要输入的表达式必须采用正确的后缀格式,并且多位数必须用括号括起来 这是我的密码: float expression::eval() { std::stack<float> s; float op1, op2; for (int i = 0; i < expr.length();
float expression::eval()
{
std::stack<float> s;
float op1, op2;
for (int i = 0; i < expr.length(); i++)
{
if (expr[i] == '(')
{
float sum = 0;
while (expr[++i] != ')')
{
sum = sum * 10.0 + (float(expr[i]) - float('0'));
}
s.push(sum);
continue;
}
else if (!isOperator(expr[i]))
{
s.push(float(expr[i]) - float('0'));
}
else
{
op2 = s.top();
s.pop();
op1 = s.top();
s.pop();
switch (expr[i])
{
case '+':
s.push(op1 + op2);
break;
case '-':
s.push(op1 - op2);
break;
case'*':
s.push(op1*op2);
break;
case '/':
s.push(op1 / op2);
break;
default:
std::cerr << "Wrong operator" << std::endl;
return 0;
}
}
}
return s.top();
}
例如:-12+12*2
需要写为
(12)(12)+2*
这就是我试过的。但是,它不起作用。谁能解释一下这个逻辑有什么不对吗
if (expr[i] == '(')
{
float sum = 0;
bool flag = false;
while (expr[++i] != ')')
{
if (expr[i] == '-')
flag = true;
sum = sum * 10.0 + (float(expr[i]) - float('0'));
}
if (flag)
sum = -sum;
s.push(sum);
continue;
}
您只支持二进制运算符,因此需要将表达式写成(0)(12)-。如果您想单独支持,请添加对一元负号的支持。也就是说,如果堆栈上只有一个操作数,那么要么将其计算为一元数,要么只提供零和常规二进制运算符。这是一个好主意,但似乎效率不高。顺便说一句,旗帜逻辑有什么问题吗?@kesarling这是我尝试过的。但是,它不起作用--。明白了!!!。如果标志为真,只需要增加I。这就是我错过的。调试帮了我很多:)非常感谢。最后,我想,现在超链接还有一个答案,你不应该在
if(flag)
之后陷入sum=
。'-'-'0'
的值没有意义。
if (expr[i] == '(')
{
float sum = 0;
bool flag = false;
while (expr[++i] != ')')
{
if (expr[i] == '-')
flag = true;
sum = sum * 10.0 + (float(expr[i]) - float('0'));
}
if (flag)
sum = -sum;
s.push(sum);
continue;
}