我想编写一个函数,该函数将从这样的“正常”表示法:“ 1 + 4 * 2-8”转换为该预先表示法:“ + 1- * 428”。
我希望您能明白这一点。要点:必须在字符串中。
到目前为止我得到的是:
(define (converter lst )
(let ((operand1 (car lst))
(operator (car (cdr lst)))
(operand2 (caddr lst)))
(list operator
(converter operand1)
(converter operand2)))
)
(infixLst->prefixLst '(1 + 2 * 3))
我在这里遇到两个问题。
1)用于列表,我需要它适用于“ 1 + 3”和not'(1 + 3)
之类的字符串2)到目前为止,它仍然无法使用(甚至不适用于List),因为它给了我一些有关“汽车”的错误,例如:汽车:期望一对,给定1
Soo从列表开始->字符串更改:(我知道(列表在这里不适当。以及其他列表方法,但到目前为止我没有更好的主意。
(define (infix->prefix str)
(let ((operand1 (car str))
(operator (cadr str))
(operand2 (caddr str)))
(list operator
(infix->prefix operand1)
(infix->prefix operand2)))
)
(infix->prefix "1 + 2")
通常的符号1+4*2-8
被称为中缀符号。
如果您只需要使用该表示法,则Racket拥有一个就绪的模块:(require infix)
,here's a link to its documentation。
如果您想练习编写自己的中缀解析器,则shunting-yard algorithm可以做到这一点。它使用堆栈来跟踪数学表达式中的运算符。如果要从字符串解析数学,则需要首先将字符串拆分为标记(数字和运算符)列表。然后将调车场应用于该列表。