Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++_Expression_Expression Evaluation - Fatal编程技术网

C++ 为什么不是';在后缀求值中尝试减法时不起作用?

C++ 为什么不是';在后缀求值中尝试减法时不起作用?,c++,expression,expression-evaluation,C++,Expression,Expression Evaluation,我正试图从后缀中得到结果。但是减法的时候我错了,不知道为什么。请给C++新手提供很多帮助。 我从堆栈中得到了两个操作数。并尝试减法“最后一次弹出”-“第一次弹出” /*pf_exp是后缀表达式。字符串类型*/ 对于(int i=0;i您可能认为堆栈是一个队列。您期望(7-8)-9=-10,但是,由于您使用的是堆栈,最后添加的项将被返回,因此正如Ben所写,您实际上正在执行7-(8-9)=8。请改用队列,并更改操作数的顺序以获得实际需要的结果 更新 很抱歉,我的解释没有考虑后缀计算。正如注释所述,

我正试图从后缀中得到结果。但是减法的时候我错了,不知道为什么。请给C++新手提供很多帮助。 我从堆栈中得到了两个操作数。并尝试减法“最后一次弹出”-“第一次弹出”

/*pf_exp是后缀表达式。字符串类型*/

对于(int i=0;i您可能认为堆栈是一个队列。您期望(7-8)-9=-10,但是,由于您使用的是堆栈,最后添加的项将被返回,因此正如Ben所写,您实际上正在执行7-(8-9)=8。请改用队列,并更改操作数的顺序以获得实际需要的结果

更新


很抱歉,我的解释没有考虑后缀计算。正如注释所述,它应该根据定义始终使用堆栈。尽管如此,我的回答可能解释了为什么您想到了错误的结果。

为什么您希望
-10
来自
(7-(8-9))
?和/的操作数以“错误”的顺序离开堆栈。你必须对此进行补偿。@BenVoigt不是
789--
的意思是
7-8-9
?我把中缀改为后缀的想法是否错了?不,写
(7-8)-9
在RPN中是
78-9-
@BenVoigt哦,天哪…我是个傻瓜…后缀评估需要堆栈,而不是队列。我想
789--
的意思是
7-8-9
。我想从中缀改为中缀是不是想错了?@JWLee:你一定想错了,但它没有那么复杂。步骤1:编写规范的中缀制作所有括号都是显式的:
(7-8)-9
步骤2:将每个操作符移动到后缀位置:
(78-)9-
。步骤3:删除括号:
78-9-
请注意,后缀符号被定义为需要堆栈的原因是,对于队列,您总是从左到右执行操作:
7↓8-9-
7↓8.↓9--
的计算结果相同。使用堆栈,您可以实现任何操作的优先级,从而可以计算像
(a+b)/(c-d)
这样的表达式,这在队列中是不可能的(使用堆栈,输入
a↓b+c↓d-/
)。
/*pf_exp is postfix expression. String type*/
for (int i=0; i<pf_exp.length(); i++)
{
    int sub_result; // saving result.
    if (48 <= (int)pf_exp[i] && (int)pf_exp[i] <= 57)
    {
        operands.push((int)pf_exp[i] - 48);
    }
    else
    {
        /*operators is a stack<int> from '#include<stack>' storing operands.*/
        int operand2 = operands.top();
        operands.pop();
        int operand1 = operands.top();
        operands.pop();
        if(pf_exp[i] == '+')
        {
            sub_result = operand1 + operand2;
        }
        else if(pf_exp[i] == '-')
        {
            sub_result = operand1 - operand2;
        }
        else if(pf_exp[i] == '*')
        {
            sub_result = operand1 * operand2;
        }
        else if(pf_exp[i] == '/')
        {
            sub_result = operand1 / operand2;
        }
        operands.push(sub_result);
    }
}