C++ 为什么不是';在后缀求值中尝试减法时不起作用?
我正试图从后缀中得到结果。但是减法的时候我错了,不知道为什么。请给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。请改用队列,并更改操作数的顺序以获得实际需要的结果 更新 很抱歉,我的解释没有考虑后缀计算。正如注释所述,
/*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);
}
}