评估后修复将操作数推入堆栈

时间:2018-04-10 16:35:02

标签: scheme

不知道如何开始这个,有什么建议吗?

定义一个名为(eval-postfix p)的SCHEME函数,该函数将采用后缀表达式(存储在表示操作符和表示运算符的字符的整数列表中),计算该表达式并返回结果。 您的函数应支持加法(#+),减法(# - ),乘法(#*),除法(#/)和取幂(#\)的运算。 您可能希望以一个函数开始递增工作,该函数接受表示运算符的字符,并且可以从堆栈中弹出两个操作数,评估运算符并将结果推回堆栈。接下来,您可以添加一个函数,通过将操作数推送到堆栈并在遇到时评估运算符来计算后缀表达式。注意,你可能想用这个号码?用于确定列表中的项是操作数还是操作符的函数。

2 个答案:

答案 0 :(得分:0)

创建一个在堆栈上执行单个指令的函数,并返回更改的堆栈:

(define (postfix-execute-one instruction stack) ...)

应检查指令是number?还是符号'+。如果它是一个数字,你可以返回(cons instruction stack)来推送它,如果它是一个操作员你需要从堆栈中弹出2个项目,添加它们(或减去它们)然后按下它堆栈并返回。

然后你可以制作

(define (postfix-execute-all instructions stack) ...)

以递归方式遍历指令列表,使用前面定义的辅助函数执行每个指令,直到达到null?。然后它可以返回最后的堆栈。

答案 1 :(得分:0)

这是您详细说明中详细说明的建议起点 这是一个很好的起点,所以坚持下去。

编写一个函数,其输入是一个运算符和一个堆栈:

operator: +
stack: |x y z w|

它应弹出两个操作数:

operator: +
left operand: x
right operand: y
stack: |z w|

评价:

result: x + y = A
stack: |z w|

并返回堆栈,结果添加在顶部:

|A z w|

当您完成此操作(确保使用所有五个操作符进行测试)时,您可以使用此功能来实现完整的评估功能。