Scheme 将操作数推入堆栈的计算后修复
不知道怎么开始,有什么建议吗 定义一个名为(eval postfix p)的SCHEME函数,该函数将接受后缀表达式(存储在表示操作数的整数和表示运算符的字符列表中),对该表达式求值,然后返回结果。 您的函数应该支持加法(#+)、减法(#-)、乘法(#*)、除法(#/)和幂运算(#\710)。Scheme 将操作数推入堆栈的计算后修复,scheme,Scheme,不知道怎么开始,有什么建议吗 定义一个名为(eval postfix p)的SCHEME函数,该函数将接受后缀表达式(存储在表示操作数的整数和表示运算符的字符列表中),对该表达式求值,然后返回结果。 您的函数应该支持加法(#+)、减法(#-)、乘法(#*)、除法(#/)和幂运算(#\710)。 您可能希望从一个函数开始以增量方式工作,该函数采用表示运算符的字符,可以从堆栈中弹出两个操作数,计算运算符并将结果推回到堆栈上。接下来,您可以添加一个函数,通过将操作数推到堆栈上并在遇到运算符时计算后缀表
您可能希望从一个函数开始以增量方式工作,该函数采用表示运算符的字符,可以从堆栈中弹出两个操作数,计算运算符并将结果推回到堆栈上。接下来,您可以添加一个函数,通过将操作数推到堆栈上并在遇到运算符时计算后缀表达式。注意,您可能想使用该号码?函数来确定列表中的项是操作数还是运算符。生成一个函数,在堆栈上执行单个指令,并返回更改的堆栈:
(定义(后缀执行一个指令堆栈)
...)
它应该检查指令是否是数字?
或类似'+
的符号。如果它是一个数字,您可以返回(cons指令堆栈)
来推送它,如果它是一个运算符,您需要从堆栈中弹出两个项目,将它们相加(或相减),然后将其推送到堆栈上并返回
那你就可以
(定义(后缀执行所有指令堆栈)
...)
它递归地在指令列表上循环,使用前面定义的helper函数执行每个指令,直到它达到
null?
。然后它可以返回最终堆栈。这是您详细描述的建议起点。这是一个很好的起点,所以要坚持下去 编写一个输入为一个运算符和一个堆栈的函数:
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|
完成此操作后(确保使用所有五个运算符进行测试),可以使用此函数实现完整的求值函数 后缀:
4567++
与(4+(5+(6+7))
相同,而456+7++
与((4+5)+6)+7)相同。基本上,一个数字被推到堆栈上,由一个操作符对前2位执行操作。例如,5 3 4+
将在堆栈上保留5 7
。另一个+
在堆栈上是12
。如果您想要((4*5)+(6*7))
您需要执行45*6*7*+