(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)))
队列的表示
最新推荐文章于 2022-12-31 20:56:54 发布