Подобный вопрос был задан здесь , Тем не менее, все еще остается без ответа (по крайней мере, код не предоставлен, хотя предложение является хорошим)
Мой код, в отличие от гиперссылки, оценивает толькоВведенное выражение Я не могу выдумать логику для принятия отрицательных чисел.Обратите внимание, что в моем коде вводимое выражение должно быть в правильном формате постфикса, а многозначные числа должны быть заключены в круглые скобки.
Вот мой код:
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;
}