diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-05-15 21:51:33 +0200 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-05-15 21:51:33 +0200 |
| commit | e9b54921d6d3b0bfc2412b90b9405ad7d8096bf8 (patch) | |
| tree | 15fe66e266fafc026423ee206ebf493858091a6b /coding-exercises/3/21.rkt | |
| parent | 89e254e7e92688dac934e4f9404c4dfa69656943 (diff) | |
save point
Diffstat (limited to 'coding-exercises/3/21.rkt')
| -rw-r--r-- | coding-exercises/3/21.rkt | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/coding-exercises/3/21.rkt b/coding-exercises/3/21.rkt new file mode 100644 index 0000000..646a8f7 --- /dev/null +++ b/coding-exercises/3/21.rkt @@ -0,0 +1,83 @@ +#lang racket +(require compatibility/mlist) +;; queue methods +(define (front-ptr q) (mcar q)) +(define (rear-ptr q) (mcdr q)) +(define (set-front-ptr! q v) (set-mcar! q v)) +(define (set-rear-ptr! q v) (set-mcdr! q v)) +(define (empty-queue? q) (null? (front-ptr q))) +(define (make-queue) (mcons '() '())) +(define (front-queue q) + (if (empty-queue? q) + (error "FRONT called on empty queue" q) + (mcar (front-ptr q)))) +(define (insert-queue! q item) + (let ((new-item (mlist item))) + (cond ((empty-queue? q) + (set-front-ptr! q new-item) + (set-rear-ptr! q new-item) + q) + (else + (set-mcdr! (rear-ptr q) new-item) + (set-rear-ptr! q new-item) + q)))) +(define (delete-queue! q) + (cond ((empty-queue? q) + (error "DELETE! called with an empty queue" q)) + (else + (set-front-ptr! q (mcdr (front-ptr q))) + q))) +;; 21 +(define (print-queue q) + (front-ptr q)) +(define q1 (make-queue)) +(print-queue (insert-queue! q1 'a)) +(print-queue (insert-queue! q1 'b)) +(print-queue (delete-queue! q1)) +(print-queue (delete-queue! q1)) +;; 22 +(define (make-queue-obj) + (let ((front-ptr '()) + (rear-ptr '())) + (define (set-front-ptr! v) + (set! front-ptr v)) + (define (set-rear-ptr! v) + (set! rear-ptr v)) + (define (empty-queue?) + (null? front-ptr)) + (define (front-queue) + (mcar front-ptr)) + (define (insert-queue! item) + (let ((new-pair (mlist item))) + (cond ((empty-queue?) + (set-front-ptr! new-pair) + (set-rear-ptr! new-pair)) + (else (set-mcdr! rear-ptr new-pair) + (set-rear-ptr! new-pair))))) + (define (delete-queue!) + (cond ((empty-queue?) + (error "DELETE! called with an empty queue" front-ptr)) + (else + (set-front-ptr! (mcdr front-ptr))))) + (define (dispatch m) + (cond ((eq? m 'front-ptr) front-ptr) + ((eq? m 'rear-ptr) rear-ptr) + ((eq? m 'set-front-ptr!) set-front-ptr!) + ((eq? m 'set-rear-ptr!) set-rear-ptr!) + ((eq? m 'empty-queue?) empty-queue?) + ((eq? m 'front-queue) front-queue) + ((eq? m 'insert-queue!) insert-queue!) + ((eq? m 'delete-queue!) delete-queue!) + ((eq? m 'print-queue) front-ptr) + (else (error "Message note defined on queue" m)))) + dispatch)) +(define qobj (make-queue-obj)) +((qobj 'insert-queue!) 'a) +(qobj 'print-queue) +((qobj 'insert-queue!) 'b) +(qobj 'print-queue) +((qobj 'insert-queue!) 'c) +(qobj 'print-queue) +((qobj 'delete-queue!)) +(qobj 'print-queue) +;; 23 |
