fork download
  1. ; circular arrays
  2.  
  3. (define (make-queue n)
  4. (let ((q (make-vector n #f))
  5. (start 0) (end 0) (size 0))
  6. (lambda (command . args)
  7. (case command
  8. ((empty?) (zero? size))
  9. ((enqueue)
  10. (if (= n size)
  11. (error 'enqueue "Full")
  12. (begin
  13. (set! size (+ size 1))
  14. (vector-set! q end (car args))
  15. (set! end (modulo (+ end 1) n)))))
  16. ((dequeue)
  17. (if (zero? size)
  18. (error 'enqueue "Empty")
  19. (let ((x (vector-ref q start)))
  20. (set! size (- size 1))
  21. (vector-set! q start #f)
  22. (set! start (modulo (+ start 1) n))
  23. x)))))))
  24.  
  25. (define q (make-queue 3))
  26. (q 'enqueue 1)
  27. (q 'enqueue 2)
  28. (q 'enqueue 3)
  29. (display (q 'dequeue)) (newline)
  30. (display (q 'dequeue)) (newline)
  31. (display (q 'dequeue)) (newline)
  32. (display (q 'empty?)) (newline)
  33.  
  34. (define (make-queue)
  35. (let ((q (cons (list) (list)))) ; front/back
  36. (lambda (command . args)
  37. (case command
  38. ((empty?)
  39. (and (null? (car q)) (null? (cdr q))))
  40. ((enqueue)
  41. (set-cdr! q (cons (car args) (cdr q))))
  42. ((dequeue)
  43. (cond ((pair? (car q))
  44. (let ((x (caar q)))
  45. (set-car! q (cdar q))
  46. x))
  47. (else (set-car! q (reverse (cdr q)))
  48. (set-cdr! q (list))
  49. (if (null? (car q))
  50. (error 'dequeue "Empty")
  51. (let ((x (caar q)))
  52. (set-car! q (cdar q))
  53. x)))))))))
  54.  
  55. (set! q (make-queue))
  56. (display (q 'empty?)) (newline)
  57. (q 'enqueue 1)
  58. (q 'enqueue 2)
  59. (display (q 'empty?)) (newline)
  60. (display (q 'dequeue)) (newline)
  61. (q 'enqueue 3)
  62. (q 'enqueue 4)
  63. (display (q 'dequeue)) (newline)
  64. (display (q 'dequeue)) (newline)
  65. (display (q 'dequeue)) (newline)
Success #stdin #stdout 0.02s 8800KB
stdin
Standard input is empty
stdout
1
2
3
#t
#t
#f
1
2
3
4