gpt4 book ai didi

smalltalk - smalltalk中的后缀计算

转载 作者:行者123 更新时间:2023-12-01 02:26:39 24 4
gpt4 key购买 nike

我必须编写一个代码来评估 Smalltalk 中的后缀符号(反向波兰评估)。我已经阅读了文档并实现了一个堆栈。这是我到目前为止编写的代码:

Object subclass: #Rpcalc
instanceVariableNames: 'anArray top'
classVariableNames: ''
poolDictionaries: ''
category: nil !

pop:
| item |
item := anArray at: top.
top := top - 1.
^item!

push: item
top := top + 1.
anArray at: top put: item!

setsize: n
anArray := Array new: n.
top := 0!

evaluate:
| expression aToken op1 op2 operator answer|
Transcript show: 'Enter Expression' .
expression :- stdin nextLine.

| aStack |
aStack := Array new: 10 .

aToken := self getNextToken.
((aToken key) = 'operand')
ifTrue: [push : aToken].

aToken := self getNextToken.
((aToken key) = 'operator')
ifTrue: [op1 := pop.
op2 := pop.
operator := aToken.
"if(operator := +)"
"answer := op1 + op2"

我想知道如何标记表达式中的每个元素。例如,
对于表达式,
10 3 + 3 7 * -
我需要将它等同于一个 token 。如果是操作数,则应将其压入堆栈。如果是运算符,则弹出堆栈两次以获取操作数并计算表达式。我对 smalltalk 完全陌生,所以我对语法一无所知。

最佳答案

您没有指定您使用的是哪种 Smalltalk 方言。在 Squeak 中,您可以使用 findTokens:方法:

'336 8 4 2 1 + - * /' findTokens: ' '
==> an OrderedCollection('336' '8' '4' '2' '1' '+' '-' '*' '/')

使用 isDigit测试 token 是否为数字:
'336' first isDigit
==> true
'+' first isDigit
==> false

要将字符串转换为数字,您可以使用 asNumber :
'336' asNumber
==> 336

整个 RPN 解析器/求值器可以用不到 10 行代码轻松实现,但显然这是您要做的功课(提示:不需要实现堆栈,已经有了)。

关于smalltalk - smalltalk中的后缀计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15820995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com