이번 문제는 상태가 있는 프로시저로 queue를 구현하는 문제입니다.

상태가 있는 프로시저가 무엇인지 기억이 나지 않아 앞에 것을 공부하였습니다.OTL...

 

잘 되는군요.^^

 

그리 심하게 어렵지 않았던 것으로 기억합니다.

(사실 이 문제는 어제 풀었으나 너무 피곤해서 잠을 일찍 잔터라 오늘 포스팅합니다.

따라서 무엇을 조심해야하는지 전혀 기억이 나지 않습니다.OTL....)

 

 

참조

해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 345

 

 

; exercise 3.22
(define (make-queue)
  (let ((front-ptr null) ; 처음에는 빈 큐이므로 null
        (rear-ptr null)) ; 처음에는 빈 큐이므로 null
    ; insert-queue 정의
    (define (insert-queue item)
      (let ((new-pair (cons item '())))
        (cond ((null? front-ptr)
               (set! front-ptr new-pair)
               (set! rear-ptr new-pair))
              (else
               (set-cdr! rear-ptr new-pair)
               (set! rear-ptr new-pair)))))
    ; delete-queue 정의
    (define (delete-queue)
      (cond ((null? front-ptr)
             (error "DELETE! called with an empty queue"))
            (else
             (set! front-ptr (cdr front-ptr)))))
    ; print-queue 정의
    (define (print-queue)
      (define (print-iter q)
        (cond ((null? q) null)
              (else (display (car q))
                    (display " ")
                    (print-iter (cdr q)))))
      (print-iter front-ptr)
      (newline))
    ; dispatch 정의
    (define (dispatch m)
      (cond ((eq? m 'empty-queue?)
             (null? front-ptr))
            ((eq? m 'front-queue?)
             (if (null? front-ptr)
                 (error "FRONT called with an empty queue")
                 (car front-ptr)))
            ((eq? m 'insert-queue!) insert-queue)
            ((eq? m 'delete-queue!) (delete-queue))
            ((eq? m 'print-queue) (print-queue))))
    dispatch))

; execute
(define q1 (make-queue))
(q1 'print-queue)
((q1 'insert-queue!) 'a)
(q1 'print-queue)
((q1 'insert-queue!) 'b)
(q1 'print-queue)
(q1 'delete-queue!)
(q1 'print-queue)
(q1 'delete-queue!)
(q1 'print-queue)

크리에이티브 커먼즈 라이센스
Creative Commons License

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1572

댓글을 달아 주세요

[로그인][오픈아이디란?]