Skip to content

Commit 215198d

Browse files
committed
Finished 3.22
1 parent 65c77e7 commit 215198d

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

3.22.scm

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
(define (make-queue)
2+
(let ((front-ptr '())
3+
(rear-ptr '()))
4+
(define (dispatch m)
5+
(cond ((eq? m 'front-ptr) front-ptr)
6+
((eq? m 'rear-ptr) rear-ptr)
7+
((eq? m 'set-front-ptr!) (lambda (v) (set! front-ptr v)))
8+
((eq? m 'set-rear-ptr!) (lambda (v) (set! rear-ptr v)))
9+
((eq? m 'empty-queue?) (null? front-ptr))
10+
((eq? m 'front-queue) (if (null? front-ptr)
11+
(error "FRONT called with an empty queue")
12+
(car front-ptr)))
13+
((eq? m 'insert-queue!) (lambda (item)
14+
(let ((new-pair (cons item '())))
15+
(cond ((null? front-ptr)
16+
(set! front-ptr new-pair)
17+
(set! rear-ptr new-pair)
18+
front-ptr)
19+
(else
20+
(set-cdr! rear-ptr new-pair)
21+
(set! rear-ptr new-pair)
22+
front-ptr)))))
23+
((eq? m 'delete-queue!) (cond ((null? front-ptr)
24+
(error "DELETE! called with empty queue"))
25+
(else
26+
(set! front-ptr (cdr front-ptr))
27+
front-ptr)))))
28+
dispatch))
29+
30+
(define (front-ptr queue) (queue 'front-ptr))
31+
(define (rear-ptr queue) (queue 'rear-ptr))
32+
(define (set-front-ptr! queue v) ((queue 'set-front-ptr!) v))
33+
(define (set-rear-ptr! queue v) ((queue 'set-rear-ptr!) v))
34+
(define (empty-queue? queue) (queue 'empty-queue?))
35+
(define (front-queue queue) (queue 'front-queue))
36+
(define (insert-queue! queue item) ((queue 'insert-queue!) item))
37+
(define (delete-queue! queue) (queue 'delete-queue!))

0 commit comments

Comments
 (0)