-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathqueue.lisp
52 lines (46 loc) · 1.59 KB
/
queue.lisp
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
(defpackage :cp/queue
(:use :cl)
(:export #:queue #:make-queue #:enqueue #:dequeue #:queue-empty-p #:queue-peek #:enqueue-front)
(:documentation "Provides queue with singly linked list. This queue provides
three constant-time operations: insertion at both ends and deletion at one
end. If you need deletion at both ends, please use CP/DEQUE."))
(in-package :cp/queue)
(defstruct (queue (:constructor make-queue
(&optional list &aux (tail (last list))))
(:copier nil)
(:predicate nil))
(list nil :type list)
(tail nil :type list))
(declaim (inline enqueue))
(defun enqueue (obj queue)
"Inserts OBJ to the end of QUEUE."
(symbol-macrolet ((list (queue-list queue))
(tail (queue-tail queue)))
(if list
(setf (cdr tail) (list obj)
tail (cdr tail))
(setf tail (list obj)
list tail)))
queue)
(declaim (inline dequeue))
(defun dequeue (queue)
"Removes and returns the element at the front of QUEUE. Returns NIL if QUEUE
is empty."
(pop (queue-list queue)))
(declaim (inline queue-empty-p))
(defun queue-empty-p (queue)
(null (queue-list queue)))
(declaim (inline queue-peek))
(defun queue-peek (queue)
"Returns the element at the front of QUEUE."
(car (queue-list queue)))
(declaim (inline enqueue-front))
(defun enqueue-front (obj queue)
"Inserts OBJ to the front of QUEUE."
(symbol-macrolet ((list (queue-list queue))
(tail (queue-tail queue)))
(if list
(push obj list)
(setf tail (list obj)
list tail))
queue))