Как принимать отрицательные значения в постфиксных выражениях - PullRequest
2 голосов
/ 19 апреля 2019

Подобный вопрос был задан здесь , Тем не менее, все еще остается без ответа (по крайней мере, код не предоставлен, хотя предложение является хорошим)

Мой код, в отличие от гиперссылки, оценивает толькоВведенное выражение Я не могу выдумать логику для принятия отрицательных чисел.Обратите внимание, что в моем коде вводимое выражение должно быть в правильном формате постфикса, а многозначные числа должны быть заключены в круглые скобки.

Вот мой код:

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;
        }
...