Racket RPN Validator

时间:2017-04-08 11:45:01

标签: scheme racket

我目前正在尝试用球拍创建一个反向波兰表示法程序。我希望有6个数字和5个运算符。列表中的数字由-1表示,而运算符在列表中表示为1。

在下面的代码中,我可以获得列表的所有排列,没有重复。我在列表的前面添加两个-1,最后一个1,这是因为对于有效的RPN,它需要在开始时有两个数字,在结尾有一个运算符。

;This our original list to create reverse polish notation -1 will represent operators
;and 1 will represent numbers. It doesnt have two -1's and one 1 because for valid
;reverse polish notaion it needs to start with two nummbers and end with an operator
(define start-perm (list -1 -1 -1 -1 1 1 1 1))

;This line creates all permutations of the original RPN list and it removes the duplicates 
(define perms (remove-duplicates (permutations start-perm)))

;This function adds the two 1s to the front of the list and the -1 to the end of the list 
(define (make-rpn l)
 (append (list 1 1) l (list -1)))

(make-rpn (car  perms))
; adds 1 1 to start of all permutations and adds -1 to the end of all permutations
(map make-rpn perms)

我遇到的问题是我无法只输出有效的RPN。通过研究似乎堆栈是最好的方法,但我似乎无法将其实现到此代码中。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案可能是将输入反转并将其传递给(常规)波兰表示法的递归下降解析器:

(define (validate rpn)
  (define/match (go pn)
    [(`(1  . ,rest)) rest]
    [(`(-1 . ,rest)) (let ([rest^ (go rest)])
                       (and rest^ (go rest^)))]
    [(else) #f])
  (null? (go (reverse rpn))))

(顺便说一下,使用符号会更清楚,比如'num和'op,而不是1和-1。)