データ構造

  • Last In First Out (LIFO)
(define stack '())
(define set-stack
 (lambda ()
  (set! stack '())
  'done))
(define push
 (lambda (x)
  (cond ((null? stack) (set! stack (list x)))
        (else (set! stack (cons x stack))))
   stack))
(define pop
 (lambda ()
  (let ((tmp '()))
   (cond ((null? stack) '())
         (else (set! tmp (car stack))
               (set! stack (cdr stack))
               tmp) ))))
(set-stack)
(push 'a)
(push 'b)
(push 'c)
(pop)
(pop)
(pop)
(pop)
done
(a)
(b a)
(c b a)
c
b
a
()
  • First In First Out (FIFO)
(define queue '())
(define tail '())
(define set-queue
 (lambda ()
  (set! queue '())
  (set! tail '())
  'done))
(define enqueue
 (lambda (x)
  (cond ((null? queue)
          (set! queue (list x))
          (set! tail queue))
        (else (set-cdr! tail (list x))
              (set! tail (cdr tail))))
  queue))
(define dequeue
 (lambda ()
  (let ((tmp '()))
   (cond ((null? queue) '())
         (else (set! tmp (car queue))
               (set! queue (cdr queue))
               tmp) ))))
> (set-queue)
done
> (enqueue 'a)
(a)
> (enqueue 'b)
(a b)
> (enqueue 'c)
(a b c)
> (dequeue)
a
> (dequeue)
b
> (dequeue)
c
> (dequeue)
()
(define dfs-w (lambda (tree)
 (define chk (lambda (tree)
  (cond ((null? tree) (reverse stack))
        ((nonpair? tree) (push tree))
        (else (chk (car tree))
              (chk (cdr tree))))))
 (set-stack) (chk tree)))
(define data '((a1 (b1)(b2)) (a2 (b3))))
(dfs-w data)
  • ひたすら探して、あったら登録、なければスキップ
(define fail '())
(call/cc (lambda (f-cc)
 (set! fail
  (lambda () (if (null? stack)
                 (f-cc 'empty)
                 ( ((pop)) ))))))
(define choose
 (lambda x
  (if (null? x)
      (fail)
      (call/cc (lambda (c-cc)
       (push (lambda () (c-cc (apply choose (cdr x)))))
       (car x))) )))
(set-stack)
(choose)
(choose 'test)
(define odd-killer
 (lambda ()
  (let ((x (choose 1 2)))
   (if (odd? x)
    (fail)
    x) )))
(define two-nums
 (lambda ()
  (list (choose 2 3)
        (choose 5 7) )))
(two-nums)
(fail)
(fail)
(fail)
(fail)

(2 5)
(2 7)
(3 5)
(3 7)
empty