如何更改此功能,“汽车”出现问题

问题描述 投票:1回答:1

我想编写一个函数,该函数将从这样的“正常”表示法:“ 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")
scheme racket
1个回答
0
投票

通常的符号1+4*2-8被称为中缀符号。

  • 如果您只需要使用该表示法,则Racket拥有一个就绪的模块:(require infix)here's a link to its documentation

  • 如果您想练习编写自己的中缀解析器,则shunting-yard algorithm可以做到这一点。它使用堆栈来跟踪数学表达式中的运算符。如果要从字符串解析数学,则需要首先将字符串拆分为标记(数字和运算符)列表。然后将调车场应用于该列表。

© www.soinside.com 2019 - 2024. All rights reserved.