diff options
Diffstat (limited to 'shared/queue.rkt')
| -rw-r--r-- | shared/queue.rkt | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/shared/queue.rkt b/shared/queue.rkt new file mode 100644 index 0000000..4777cce --- /dev/null +++ b/shared/queue.rkt @@ -0,0 +1,30 @@ +#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))) |
