Как принимать отрицательные значения в постфиксных выражениях

Аналогичный вопрос был задан здесь , Однако до сих пор остается без ответа (по крайней мере, код не предоставлен, хотя предложение хорошее)

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

Вот мой код:

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

person Community    schedule 19.04.2019    source источник
comment
Вы поддерживаете только бинарные операторы, поэтому вам нужно будет написать выражение как (0) (12)-. Хочешь поддержать - самостоятельно добавь поддержку унарного минуса. т.е. если в стеке есть только один операнд, то либо оценивайте его как унарный, либо просто укажите нуль и можете использовать обычный бинарный оператор.   -  person Josh Homann    schedule 19.04.2019
comment
Идея хорошая, но не очень эффективная. Кстати, что не так с логикой флага?   -  person    schedule 19.04.2019
comment
@kesarling Это то, что я пробовал. Но это не работает -- Как отлаживать небольшие программы.   -  person PaulMcKenzie    schedule 19.04.2019
comment
понятно!!!. просто нужно увеличить I, если флаг истинен. Вот чего мне не хватало. Отладка мне очень помогла :) Большое спасибо. Наконец-то, наверное, теперь и по гиперссылке есть ответ   -  person    schedule 19.04.2019
comment
Кажется, моей репутации недостаточно. Может ли кто-нибудь с репутацией ›50 предоставить гиперссылку сюда в комментариях по адресу ссылку пожалуйста?   -  person    schedule 19.04.2019
comment
Вы не должны провалиться в sum = после if (flag). Значение '-' - '0' не имеет смысла.   -  person o11c    schedule 19.04.2019
comment
это то что. Я получил это после предложения по отладке, которое я получил. Теперь работает нормально   -  person    schedule 19.04.2019