Queue implementation for programming praxis.
This one wasn't much of my idea as I had recently looked at the erlang's implementation of the deque(double ended queue) module and did some analysis of the amortized O(1) complexity of this implementation for deque usage. I think it should be the same for normal queue usage
;; Author: Carlos Perilla <deepspawn@valkertown.org>
;; Date: 2013-11-01
;; License: CC0
;; http://programmingpraxis.com/2013/11/01/queues/
(define (new-queue) (list '() '()))
(define (isEmpty q) (and (list? q) (null? (car q)) (null? (cadr q))))
(define (enqueue x q) (list (car q)
(if (null? (cdr q))
(list x)
(cons x (cadr q)))))
(define (dequeue q) (if (null? (car q))
(if (null? (cadr q))
(cons 'empty q)
(let [(nh (reverse (cadr q)))]
(list (car nh) (list (cdr nh) '()))
))
(list (caar q) (list (cdar q) (cadr q)))))
(dequeue (new-queue))
(dequeue (enqueue 'c
(cadr (dequeue (enqueue 'b
(enqueue 'a
(new-queue)))))))
(isEmpty (new-queue))
(dequeue
(cadr (dequeue (enqueue 'd
(enqueue 'c
(cadr (dequeue (enqueue 'b
(enqueue 'a
(new-queue))))))))))