我目前正在尝试用球拍创建一个反向波兰表示法程序。我希望有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。通过研究似乎堆栈是最好的方法,但我似乎无法将其实现到此代码中。任何帮助将不胜感激。
答案 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。)