当前位置: 首页 > 知识库问答 >
问题:

带有非通勤运算符的后缀

霍建章
2023-03-14

当涉及后缀与中缀中的-/运算符时,我有一个问题。

从任务中

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

我明白了。然后我被这句话弄糊涂了。

我们还必须担心非通勤运营商和/。我们将计算后缀字符串4 5-为4-5,同样,将计算4 5/为4/5。

但是当我这么做的时候。。。中缀和后缀的结果不同。

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

中缀

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

后缀

5 4 - 3 10 *

29......对吗?

所以我很困惑。内缀和后缀的结果应该是相同的,对吗?这是实际作业中的打字错误还是我做错了什么?

共有3个答案

锺离辰沛
2023-03-14

计算后缀时使用堆栈:推入操作数,当到达运算符时,弹出所需操作数并推入计算结果。

对于像这样的交换运算符,操作数的顺序无关紧要。例如:

5 4 +

可评估为

PUSH 5
PUSH 4
PUSH (POP + POP)

其中第一个持久性有机污染物将产生4,第二个持久性有机污染物将产生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)
沃阳飙
2023-03-14

我想你可能会感到困惑,因为例子是4-5,而你的例子是中缀符号的5-4。

要计算后缀54-310*:
54-=5-4=1
310*=3*10=30
130=130=31

你作业中的第二个陈述只是澄清了,如果你有45-,那么它将是4-5,而不是5-4。

徐绪
2023-03-14

后缀也计算为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?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统

  • 本文向大家介绍JavaScript 逻辑非运算符(!),包括了JavaScript 逻辑非运算符(!)的使用技巧和注意事项,需要的朋友参考一下 示例 逻辑NOT(!)运算符对表达式执行逻辑取反。 语法: 返回值: 一个Boolean。 描述 逻辑NOT(!)运算符对表达式执行逻辑取反。 布尔值只需取反即可:!true === false和!false === true。 非布尔值首先转换为布尔值,

  • 问题内容: 我需要从给定的字符串中删除所有字符,除了剩下的几个字符。如何用regexp做到这一点? 简单测试:不应删除character [1,a,],而应从字符串“ asdf123 *”中删除所有其他字符。 问题答案: 集合中有^。 您应该能够执行以下操作: 完整样本:

  • 问题内容: 下列类定义了两种方法,它们在直观上都具有相同的功能。每个函数都有两个类型和一个布尔值的列表来调用,该值指定应将这些列表中的哪个分配给局部变量。 根据,有效而无效。它抱怨: 我知道查找包含三元运算符()的表达式类型的规则非常复杂,但是据我了解,它选择了最具体的类型,第二个和第三个参数都可以转换为该类型,而无需显式投。在这里,应该是,但不是。 我想解释一下为什么不是这种情况,最好参考 Ja

  • 我们如何在给定的mysql查询中选择记录:请帮助我选择查询用大小写当var1像值1或var2像值2然后'有效'其他'无效'从xx作为s 在这个查询总是运行其他条件请指导我一个有效的方法。

  • 问题内容: 我对String串联感到困惑。 输出为: 50abc20 50abc1010 我想知道为什么在两种情况下都将 20 + 30 加在一起,但是 10 + 10 需要加上括号(s1)而不是串联到String(s2)。请在此处说明String运算符的工作方式。 问题答案: 加法保持关联。以第一种情况 在第二种情况下: