首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与非通勤运算符连接到后缀

与非通勤运算符连接到后缀
EN

Stack Overflow用户
提问于 2018-02-11 23:23:33
回答 4查看 153关注 0票数 0

我有一个问题,当涉及到-/运算符在后缀和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的结果应该是相同的,对吧?这是实际作业中的错误还是我做错了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-11 23:47:30

在计算后缀时,使用堆栈:推送操作数,当到达操作符时,弹出所需的操作数并推送评估结果。

在像+这样的交换运算符的情况下,操作数的顺序并不重要。例如:

代码语言:javascript
运行
复制
5 4 +

可以被评估为

代码语言:javascript
运行
复制
PUSH 5
PUSH 4
PUSH (POP + POP)

其中第一个POP将产生4,第二个POP 5。因此,您已经真正评估了4+5。

但是对于非交换算子来说,这是行不通的。您必须计算5 / 4,而不是4/5。因此,您需要使用临时变量:

代码语言:javascript
运行
复制
 PUSH 5
 PUSH 4
 let d = POP; // divisor = 4
 let q = POP; // quotient = 5
 PUSH q/d;    // push the dividend

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

代码语言:javascript
运行
复制
PUSH 5
PUSH 4
SWAP
PUSH (POP / POP)

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

代码语言:javascript
运行
复制
PUSH 4
PUSH 5
PUSH (POP/POP)
票数 0
EN

Stack Overflow用户

发布于 2018-02-11 23:29:00

后缀值也计算为31。

让我们一步一步地看一遍:我们的表达式是

代码语言:javascript
运行
复制
5 4 - 3 10 * +

因此,堆栈进展如下:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48737554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档