stack-queue.scm 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #| -*-Scheme-*-
  2. Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
  3. 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
  4. 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Massachusetts
  5. Institute of Technology
  6. This file is part of MIT/GNU Scheme.
  7. MIT/GNU Scheme is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11. MIT/GNU Scheme is distributed in the hope that it will be useful, but
  12. WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with MIT/GNU Scheme; if not, write to the Free Software
  17. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
  18. USA.
  19. |#
  20. ;;;; Simple stack&queue Abstraction
  21. (declare (usual-integrations))
  22. (define-record-type stack&queue
  23. (%make-stack&queue front back)
  24. stack&queue?
  25. (front stack&queue-front set-stack&queue-front!)
  26. (back stack&queue-back set-stack&queue-back!))
  27. (define (make-stack&queue)
  28. (%make-stack&queue '() '()))
  29. (define (stack&queue-empty? stq)
  30. (not (pair? (stack&queue-front stq))))
  31. (define (stack&queued? stq item)
  32. (memq item (stack&queue-front stq)))
  33. (define (push! stq object)
  34. (if (pair? (stack&queue-front stq))
  35. (set-stack&queue-front! stq
  36. (cons object (stack&queue-front stq)))
  37. (begin
  38. (set-stack&queue-front! stq
  39. (cons object (stack&queue-front stq)))
  40. (set-stack&queue-back! stq
  41. (stack&queue-front stq))))
  42. unspecific)
  43. (define (add-to-end! stq object)
  44. (let ((new (cons object '())))
  45. (if (pair? (stack&queue-back stq))
  46. (set-cdr! (stack&queue-back stq) new)
  47. (set-stack&queue-front! stq new))
  48. (set-stack&queue-back! stq new)
  49. unspecific))
  50. (define (pop! stq)
  51. (let ((next (stack&queue-front stq)))
  52. (if (not (pair? next))
  53. (error "Empty stack&queue -- POP"))
  54. (if (pair? (cdr next))
  55. (set-stack&queue-front! stq (cdr next))
  56. (begin
  57. (set-stack&queue-front! stq '())
  58. (set-stack&queue-back! stq '())))
  59. (car next)))