有人问过类似的问题here,但是仍然没有答案(尽管建议很好,但至少没有提供代码)
与超链接的代码不同,我的代码仅评估输入的表达式 我无法构造一个接受负数的逻辑。 请注意,在我的代码中,要输入的表达式必须采用正确的后缀格式,并且多位数字必须用括号括起来。
这是我的代码:
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();
}
请注意,表达式是我代码中的一个对象。 我的班级:
class expression
{
//constructors and destructors
public:
expression();
~expression();
//member properties
private:
std::string expr;
//member methods
public:
// accepts the expression from the user
void input();
//prints the accepted expression
void output();
//evaluates the accepted expression
float eval();
//
friend bool isOperator(char);
};
例如:-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;
}