Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何接受后缀表达式中的负值_C++_Postfix Notation_Negative Number - Fatal编程技术网

C++ 如何接受后缀表达式中的负值

C++ 如何接受后缀表达式中的负值,c++,postfix-notation,negative-number,C++,Postfix Notation,Negative Number,然而,有人提出了类似的问题,但仍然没有答案(至少没有提供代码,尽管建议很好) 与超链接代码不同,我的代码只计算输入的表达式 我无法编造一个逻辑来接受负数。 请注意,在我的代码中,要输入的表达式必须采用正确的后缀格式,并且多位数必须用括号括起来 这是我的密码: float expression::eval() { std::stack<float> s; float op1, op2; for (int i = 0; i < expr.length();

然而,有人提出了类似的问题,但仍然没有答案(至少没有提供代码,尽管建议很好)

与超链接代码不同,我的代码只计算输入的表达式 我无法编造一个逻辑来接受负数。 请注意,在我的代码中,要输入的表达式必须采用正确的后缀格式,并且多位数必须用括号括起来

这是我的密码:

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();
}
例如:-
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;
        }

您只支持二进制运算符,因此需要将表达式写成(0)(12)-。如果您想单独支持,请添加对一元负号的支持。也就是说,如果堆栈上只有一个操作数,那么要么将其计算为一元数,要么只提供零和常规二进制运算符。这是一个好主意,但似乎效率不高。顺便说一句,旗帜逻辑有什么问题吗?@kesarling这是我尝试过的。但是,它不起作用--。明白了!!!。如果标志为真,只需要增加I。这就是我错过的。调试帮了我很多:)非常感谢。最后,我想,现在超链接还有一个答案,你不应该在
if(flag)
之后陷入
sum=
'-'-'0'
的值没有意义。
    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;
        }