我有一个问题,当涉及到-/运算符在后缀和infix。
从任务中
输入字符串5 4+3 10 *+相当于infix表达式(5 + 4) + (3 * 10),答案为39。
我明白了。然后我就被这句话搞糊涂了。
我们还必须担心非通勤运营商-和/.我们将评估后缀字符串4.5-作为4-5,同样,也将评估4.5/ as 4/5。
但是,当我这样做的时候.我得到了不同的结果。
修改第一个示例以包括减法。
infix
(5-4)+ (3 * 10) = 31
后缀
5 4-3 10 *+
29....right?
所以我很困惑。infix和postfix的结果应该是相同的,对吧?这是实际作业中的错误还是我做错了什么?
发布于 2018-02-11 23:47:30
在计算后缀时,使用堆栈:推送操作数,当到达操作符时,弹出所需的操作数并推送评估结果。
在像+
这样的交换运算符的情况下,操作数的顺序并不重要。例如:
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
或者引入一个交换操作,该操作交换堆栈中前两项:
PUSH 5
PUSH 4
SWAP
PUSH (POP / POP)
或者编译后缀以便按相反的顺序推送:
PUSH 4
PUSH 5
PUSH (POP/POP)
发布于 2018-02-11 23:29:00
后缀值也计算为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
发布于 2018-02-11 23:34:13
我认为您可能被混淆了,因为这个示例是4-5,而您的示例是5-4表示infix表示法。
评估后缀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。
https://stackoverflow.com/questions/48737554
复制相似问题