对于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 ....正确?
所以我很困惑。中缀和后缀的结果应该是一样的吗?这是实际作业中的拼写错误还是我做错了什么?
答案 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)