不知道如何开始这个,有什么建议吗?
定义一个名为(eval-postfix p)的SCHEME函数,该函数将采用后缀表达式(存储在表示操作符和表示运算符的字符的整数列表中),计算该表达式并返回结果。 您的函数应支持加法(#+),减法(# - ),乘法(#*),除法(#/)和取幂(#\)的运算。 您可能希望以一个函数开始递增工作,该函数接受表示运算符的字符,并且可以从堆栈中弹出两个操作数,评估运算符并将结果推回堆栈。接下来,您可以添加一个函数,通过将操作数推送到堆栈并在遇到时评估运算符来计算后缀表达式。注意,你可能想用这个号码?用于确定列表中的项是操作数还是操作符的函数。
答案 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|
当您完成此操作(确保使用所有五个操作符进行测试)时,您可以使用此功能来实现完整的评估功能。