Exercise 3.23. A deque (``double-ended queue'') is a sequence in which items can be inserted and deleted at either the front or the rear. Operations on deques are the constructor make-deque, the predicate empty-deque?, selectors front-deque and rear-deque, and mutators front-insert-deque!, rear-insert-deque!, front-delete-deque!, and rear-delete-deque!. Show how to represent deques using pairs, and give implementations of the operations. All operations should be accomplished in ϴ(1) steps. ———————————————————————————————————————————————————————————————————————— (define (make-deque) '(())) ;; or equivalently: ;; (define (make-deque) '(() . ()) ) (define front-ptr car) (define rear-ptr cdr) (define set-front! set-car!) (define set-rear! set-cdr!) (define prev cadr) (define next cddr) (define (empty-deque? deque) (null? (front-ptr deque))) (define (front-deque deque) (if (empty-deque? deque) (error "empty deque") (car (front-ptr deque)))) (define (rear-deque deque) (if (empty-deque? deque) (error "empty deque") (car (rear-ptr deque)))) (define (front-insert-deque! deque item) (set-front! deque (cons item (cons '() (front-ptr deque)))) (if (null? (rear-ptr deque)) (set-rear! deque (front-ptr deque)) (set-car! (cdr (next (front-ptr deque))) (front-ptr deque)))) (define (rear-insert-deque! deque item) (set-rear! deque (cons item (cons (rear-ptr deque) '()))) (if (null? (front-ptr deque)) (set-front! deque (rear-ptr deque)) (set-cdr! (cdr (prev (rear-ptr deque))) (rear-ptr deque)))) (define (front-delete-deque! deque) (if (empty-deque? deque) (error "empty deque") '()) (set-front! deque (next (front-ptr deque))) (if (null? (front-ptr deque)) (set-rear! deque '()) (set-car! (cdr (front-ptr deque)) '()))) (define (rear-delete-deque! deque) (if (empty-deque? deque) (error "empty deque") '()) (set-rear! deque (prev (rear-ptr deque))) (if (null? (rear-ptr deque)) (set-front! deque '()) (set-cdr! (cdr (rear-ptr deque)) '()))) I found this exercise somewhat dull and the implementation feels inelegant. I'm sure there are better implementations.