队列的表示

来源:互联网 发布:新东方雅思词汇知乎 编辑:程序博客网 时间:2024/05/22 10:33
(define (make-queue)  (cons '() '()))(define (front-ptr queue)  (car queue))(define (rear-ptr queue)  (cdr queue))(define (empty-queue? queue)  (null? (front-ptr queue)))(define (set-front-ptr! queue item)  (set-car! queue item))(define (set-rear-ptr! queue item)  (set-cdr! queue item))(define (front-queue queue)  (if (empty-queue? queue)      (error "empty")      (car (front-ptr queue))))(define (insert-queue! queue item)  (let ((new-pair (list item)))    (cond ((empty-queue? queue)           (set-front-ptr! queue new-pair)           (set-rear-ptr! queue new-pair)           queue)          (else (set-cdr! (rear-ptr queue) new-pair)                (set-rear-ptr! queue new-pair)                queue))))(define (delete-queue! queue)  (cond ((empty-queue? queue)         (error "empty"))        (else (set-front-ptr! queue (cdr (front-ptr queue)))              queue)));3.23双向链表,注意千万不要对一个链表求值,只能用print打印,因为prev的存在,这里存在环结构(define (make-node item)  (list (list item '())))(define (make-deque)  (cons '() '()))(define (empty-deque? queue)  (null? (front-ptr queue)))(define (front-deque queue)  (caar (front-ptr queue)))(define (rear-deque queue)  (caar (rear-ptr queue)))(define (set-prev! node prev)  (set-car! (cdar node) prev))(define (set-next! node next)  (set-cdr! node next))(define (prev-ptr node)  (cadar node))(define (front-insert-deque! queue item)  (let ((new-node (make-node item)))    (cond ((empty-deque? queue)           (set-front-ptr! queue new-node)           (set-rear-ptr! queue new-node)           queue)          (else           (set-prev! (front-ptr queue) new-node)           (set-next! new-node (front-ptr queue))           (set-front-ptr! queue new-node)           queue))))(define (rear-insert-deque! queue item)  (let ((new-node (make-node item)))    (cond ((empty-deque? queue)           (set-front-ptr! queue new-node)           (set-rear-ptr! queue new-node)           queue)          (else           (set-prev! new-node (rear-ptr queue))           (set-next! (rear-ptr queue) new-node)           (set-rear-ptr! queue new-node)           queue))))(define (front-delete-deque! queue)  (cond ((empty-deque? queue)         (error "empty"))        (else;此处没有处理尾指针         (set-front-ptr! queue (cdr (front-ptr queue)))         queue)))(define (rear-delete-deque! queue)  (cond ((empty-deque? queue)         (error "empty"))        ((eq? (front-ptr queue) (rear-ptr queue))         (set-front-ptr! queue '())         queue)        (else         (set-next! (prev-ptr (rear-ptr queue)) '())         (set-rear-ptr! queue (prev-ptr (rear-ptr queue)))         queue)))(define (print-deque queue)  (define (print-iter node)    (if (null? node)        '()        (cons (caar node) (print-iter (cdr node)))))  (print-iter (front-ptr queue)))
0 0
原创粉丝点击