使用非通勤运算符的中缀到后缀

时间:2018-02-11 23:23:33

标签: operators postfix infix-notation

对于postfix vs infix中的/运算符,我有一个问题。

从作业

  

输入字符串5 4 + 3 10 * +等同于中缀表达式   (5 + 4)+(3 * 10)答案是39。

我遵循这一点。然后我对这句话感到困惑。

  

我们还要担心非通勤运营商 - 和/。我们   将评估后缀字符串4 5 - 为4 - 5和,   同样,将评估4 5 /为4/5。

但是当我这样做时...我使用infix vs postfix获得不同的结果。

修改第一个示例以包含减法。

  

(5 - 4)+(3 * 10)= 31

后缀

  

5 4 - 3 10 * +

29 ....正确?

所以我很困惑。中缀和后缀的结果应该是一样的吗?这是实际作业中的拼写错误还是我做错了什么?

4 个答案:

答案 0 :(得分:1)

后缀也评估为31。

让我们一步一步地完成:我们的表达是

5 4 - 3 10 * +

所以堆栈进展如下:

5
5 4
1      # after evaluating -, i.e. popping 5 and 4 and pushing 5 - 4
1 3
1 3 10
1 30   # after evaluating *, i.e. popping 3 and 10 and pushing 3 * 10
31     # after evaluating +, i.e. popping 1 and 30 and pushing 1 + 30

答案 1 :(得分:1)

我认为你可能感到困惑,因为例子是4-5,你的例子是5-4的中缀表示法。

评估后缀5 4 - 3 10 * +:
5 4 - = 5 - 4 = 1
3 10 * = 3 * 10 = 30
1 30 + = 1 + 30 = 31

你的作业中的第二个陈述只是澄清,如果你有类似4 5的东西,它将是4 - 5而不是5 - 4。

答案 2 :(得分:0)

在声明中 - 和/,它的4 5 - 。那是-1,即4-5。

在较长的表达式中:5 4 - 3 10 * +

这是5 - 4,因为5是第一位的。因此,它(5-4)+(3 * 10)= 31。

如果是4 5 -3 10 * +那么将评估为29(即(4-5)+(3 * 10))。这与前缀或后缀表示法没有关系,而是我们评估参数的顺序,因为 - 和/是非交换的。该作业指定它们将在"直观"中进行评估。顺序,即x y - 表示x - y。

答案 3 :(得分:0)

当您评估postfix时,您使用堆栈:您推送操作数,当您到达操作符时,您弹出所需的操作数并推送评估结果。

对于像+这样的可交换运算符,操作数所在的顺序并不重要。例如:

5 4 +

可以评估为

PUSH 5
PUSH 4
PUSH (POP + POP)

第一个POP将产生4和第二个POP 5.所以你真的评估了4 + 5。

但是对于非交换运算符,这不会起作用。你必须评估5/4,而不是4/5。所以你需要使用临时变量:

 PUSH 5
 PUSH 4
 let d = POP; // divisor = 4
 let q = POP; // quotient = 5
 PUSH q/d;    // push the dividend

或者引入一个SWAP操作,它交换堆栈中的前两项:

PUSH 5
PUSH 4
SWAP
PUSH (POP / POP)

或者编译后缀以便按相反的顺序推送:

PUSH 4
PUSH 5
PUSH (POP/POP)