队列的表示

(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)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值