-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdeque.scm
112 lines (94 loc) · 3.29 KB
/
deque.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#lang sicp
(define (make-node val prev next) (list val prev next))
(define (val node) (car node))
(define (prev node) (cadr node))
(define (next node) (caddr node))
(define (set-prev! node item) (set-car! (cdr node) item))
(define (set-next! node item) (set-car! (cddr node) item))
(define (front-ptr deque) (car deque))
(define (rear-ptr deque) (cdr deque))
(define (set-front-ptr! deque item) (set-car! deque item))
(define (set-rear-ptr! deque item) (set-cdr! deque item))
(define (empty-deque? deque) (null? (front-ptr deque)))
(define (make-deque) (cons '() '()))
(define (front-deque deque)
(if (empty-deque? deque)
(error "FRONT called with an empty deque" deque)
(front-ptr deque)))
(define (rear-deque deque)
(if (empty-deque? deque)
(error "REAR called with an empty deque" deque)
(rear-ptr deque)))
(define (rear-insert-deque! deque item)
(let ((new-node (make-node item '() '())))
(cond ((empty-deque? deque)
(set-front-ptr! deque new-node)
(set-rear-ptr! deque new-node)
(print-deque deque))
(else
(set-next! (rear-ptr deque) new-node)
(set-prev! new-node (rear-ptr deque))
(set-rear-ptr! deque new-node)
(print-deque deque)))))
(define (front-insert-deque! deque item)
(let ((new-node (make-node item '() '())))
(cond ((empty-deque? deque)
(set-front-ptr! deque new-node)
(set-rear-ptr! deque new-node)
(print-deque deque))
(else
(set-prev! (front-ptr deque) new-node)
(set-next! new-node (front-ptr deque))
(set-front-ptr! deque new-node)
(print-deque deque)))))
(define (rear-delete-deque! deque)
(cond ((empty-deque? deque)
(error "DELETE! called with an empty deque" (print-deque deque)))
(else
(if (null? (prev (rear-ptr deque)))
(begin
(set-front-ptr! deque '())
(set-rear-ptr! deque '()))
(begin
(set-rear-ptr! deque (prev (rear-ptr deque)))
(set-next! (rear-ptr deque) '())))
(print-deque deque))))
(define (front-delete-deque! deque)
(cond ((empty-deque? deque)
(error "DELETE! called with an empty deque" (print-deque deque)))
(else
(if (null? (next (front-ptr deque)))
(begin
(set-front-ptr! deque '())
(set-rear-ptr! deque '()))
(begin
(set-front-ptr! deque (next (front-ptr deque)))
(set-prev! (front-ptr deque) '())))
(print-deque deque))))
(define (print-deque deque)
(define (print-list head)
(if (null? head)
'()
(if (null? (next head))
(cons (val head) '())
(cons (val head) (print-list (next head))))))
(print-list (front-ptr deque)))
(define q1 (make-deque))
(print-deque q1)
(rear-insert-deque! q1 3)
(front-insert-deque! q1 2)
(front-insert-deque! q1 1)
(rear-insert-deque! q1 4)
(front-delete-deque! q1)
(rear-delete-deque! q1)
(front-delete-deque! q1)
(rear-delete-deque! q1)
; -----
(front-insert-deque! q1 3)
(rear-insert-deque! q1 2)
(rear-insert-deque! q1 1)
(front-insert-deque! q1 4)
(rear-delete-deque! q1)
(front-delete-deque! q1)
(rear-delete-deque! q1)
(front-delete-deque! q1)