Шаг 71.
Очереди

    На этом шаге мы приведем общие сведения об очередях.

    Очередью будем называть списочную структуру, состоящую из некоторого списка и лисповской ячейки, содержащей указатели на первый и последний элементы этого списка [1, с.134].

    На рисунках изображены очереди, состоящие из элементов:


    Пример 1 [1]. Функция TCONC помещает значение X в конец очереди Q. Если Q является пустой очередью, то формируется очередь, состоящая из одного элемента.
   (DEFUN TCONC (LAMBDA (X Q)
   ; Добавление элемента X к очереди Q ;
      (COND ( (NULL Q) (CONS (SETQ Q (CONS X NIL)) Q) )
            (    T     (RPLACD Q (CDR (RPLACD (CDR Q)
                                              (CONS X NIL))))
            )
      )
   ))
Текст этой функции можно взять здесь.

    Тестовые примеры:

   $ (SETQ Q (TCONC A NIL))
   ((A) A)
   $ (TCONC B Q)
   ((A B) B)

    Внутреннее представление значения очереди Q после вычисления первого выражения изображено на рис. а), а после второго - на рис b).

    Заметим, что доступ к первому элементу очереди Q дает функция (CAAR Q), а к последнему - (CADR Q).

   $ (CAAR Q)
   A
   $ (CADR Q)
   B

    Исключить из очереди Q первый (но не единственный) элемент можно с помощью обращения (RPLACA Q (CDAR Q)):

   $ (RPLACA Q (CDAR Q))
   ((A) A)


    Пример 2. Приведем еще один (более наивный) способ построения очереди без использования структуро-разрушающих функций:
   (DEFUN QUEUE (LAMBDA (LST)
   ; Построение очереди из списка LST ;
      (LIST LST (LAST LST))
   ))
   ; --------------------- ;
   (DEFUN LAST (LAMBDA (LST)
   ; Функция LAST возвращает последний элемент ;
   ;              списка LST                   ;
      (COND ( (NULL LST) NIL )
            ( (NULL (CDR LST)) (CAR LST) )
            (        T         (LAST (CDR LST)) )
      )
   ))
Текст этой функции можно взять здесь.


(1)Лавров С.С., Силагадзе Г.С. Автоматическая обработка данных. Язык лисп и его реализация. - М.: Наука, 1978. - 176 с.


    На следующем шаге мы рассмотрим функции для построения очереди.




Предыдущий шаг Содержание Следующий шаг