stack<int> s;
int main() {
    string exp;
    cout << "Enter postfix expression: ";
    getline(cin, exp);
    int calc = evaluatePosfix(exp);
    cout << calc << endl;
}

int evaluatePosfix(string exp) {
    for (int i = 0; i < exp.length(); i++) {
        if (exp[i] == ' ' || exp[i] == ',') {
            continue;
        }
        if (isNum(exp[i])){
            int operand = 0;
            while(i < exp.length() && isNum(exp[i])) {
                operand = (operand*10) + (exp[i] - '0');
                i++;
            }
            i--;
            cout << operand << "&&" << endl;
            s.push(operand);
        }

        else if(isOperator(exp[i])) {
            int operand2 = s.top(); s.pop();
            int operand1 = s.top(); s.pop();
            int result = performOperation(operand1, operand2, exp[i]);
            s.push(result);
        }

        //cout << s.top() << " $$$" << endl;
    }

    return s.top();
}

bool isOperator(char c) {
    if (c == '+' || c == '-' || c == '*' || c == '/') {
        return true;
    }
    return false;
}

bool isNum(char c) {
    if (c >= '0' || c <= '9') {
        return true;
    }
    return false;
}

int performOperation(int operand1, int operand2, char operation) {
    if (operation == '+') {
        return operand1 + operand2;
    }
    else if (operation == '-') {
        return operand1 + operand2;
    }
    else if (operation == '*') {
        return operand1 * operand2;
    }
    else if (operation == '/') {
        return operand1 / operand2;
    }
    else {
        cout << "Error" << endl;
        return -1;
    }
}


修复后的评估不正确。当我输入22+时,它返回215而不是4。当程序检测到一个运算符时,它应该弹出堆栈中的2个元素,但是由于某种原因,它不会这样做。调用performOperation时,不会发生该操作,因此不会将任何内容压入堆栈。

最佳答案

如果应该将22+评估为4,则本节是罪魁祸首:

while(i < exp.length() && isNum(exp[i])) {
    operand = (operand*10) + (exp[i] - '0');
    i++;
}


您的代码被编写为处理大于10的数字,但是您的示例建议您仅支持一位数字。

10-06 14:58