Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define (list-head xs i S)
- (if (= i 0) S (list-head (cdr xs) (- i 1) (append S (list (car xs))))))
- (define (priority a)
- (if (equal? a '*) 2 (if (equal? a '/)
- 3
- (if (equal? a '+)
- 0
- (if (equal? a '-)
- 0
- 100)))))
- (define (operator? a)
- (or (equal? a '<) (< (priority a) 100)))
- (define (delete< xs S)
- (if (null? xs) S (if (equal? (car xs) '<)
- (delete< (cdr xs) S)
- (delete< (cdr xs) (append S (list (car xs)))))))
- (define (ejection x stack)
- (if (null? stack) 0 (if (or (operator? x) (equal? x '>))
- (let ((k (car stack)))
- (if (equal? k '<)
- (length stack)
- (if (equal? x '>)
- (ejection x (cdr stack))
- (if (<= (priority x) (priority k))
- (ejection x (cdr stack))
- (length stack)))))
- (length stack))))
- (define (rpn xs)
- (define (iter xs out stack)
- (if (null? xs)
- (append out (delete< stack '()))
- (let* ((a (car xs))
- (l (cdr xs))
- (k (if (and (not (null? stack)) (equal? a (car stack))) (length stack) (ejection a stack)))
- (nstek (list-tail stack (- (length stack) k)))
- (nstek (if (equal? a '>) (cdr nstek) nstek))
- (newstek (if (operator? a) (cons a nstek) nstek))
- (stack+ (list-head stack (- (length stack) k) '())))
- (iter l (append out (if (and (not (equal? a '>)) (not (operator? a))) (list a) '()) stack+) newstek))))
- (iter xs '() '()))
Advertisement
Add Comment
Please, Sign In to add comment