Аналогичный вопрос был задан здесь , Однако до сих пор остается без ответа (по крайней мере, код не предоставлен, хотя предложение хорошее)
Мой код, в отличие от кода с гиперссылкой, оценивает только введенное выражение. Я не могу создать логику для приема отрицательных чисел. Обратите внимание, что в моем коде вводимое выражение должно быть в правильном постфиксном формате, а многозначные числа должны быть заключены в круглые скобки.
Вот мой код:
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;
}
sum =
послеif (flag)
. Значение'-' - '0'
не имеет смысла. - person o11c   schedule 19.04.2019