- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
154 Глава 7
Использогание языка Паскале
intbintree == data type is bt_new, bt_isempty, bt_append_left, bt_append_right, bt.left, bt_right, bt_rootval, bt_destroy
Описание
Бинарные деревья целых чисел intbintree используются для хранения значений типа целые числа. Элемент может присутствовать в нескольких узлах такого дерева. И промежуточные узлы, и листья имеют значения. Бинарные деревья целых чисел intbintree изменяемы.
Операции
function bt_new; intbintree
effects Возвращается .пустое бинарное дерево. function btJsempty (bt: intbintree): boolean effects Возвращается значение true, если дерево bt пусто, и значение
false — в противном случае.
procedure bt_append_left (bt: intbintree; е: integer)
modifies bt effects Добавляется некоторый узел со значением е как самый левый
узел дерева bt.
procedure bt.append_right (bt: intbintree; е: integer)
modifies bt effects Добавляется некоторый узел со значением е как самый правый
узел дерева bt.
function btJeft (bt: intbintree): intbintree requires Чтобы дерево bt было не пустым.
effects Возвращается поддерево дерева bt, чей корень является левым ближайшим потомком корня дерева bt. Это поддерево может быть пустым.
function bt_right (bt: intbintree): intbintree requires Чтобы дерево bt было не пустым,
effects Возвращается поддерево дерева bt, чей корень является правым ближайшим потомком корня дерева bt. Это поддерево может быть пустым.
function bt_rootval (bt: intbintree): integer requires Чтобы дерево bt было не пустым. effects Возвращается значение корневого узла дерева bt. .procedure bt_destroy (bt; intbintree)
modifies bt
effects Освобождается вся память неупорядоченного массива, занимаемая деревом bt. end intbintree
Рис. 7.12. Спецификация бинарного дерева целых чисел intbintree.
мы получим пустую очередь, то в дереве нужного элемента не было.
На рис. 7.13 приведена реализация функции breadth.first. search. При этом предполагается, что была выполнена конкретная реализация абстракции queue [etype] при помощи замены etype на intbintree и задания имени btq получившемуся типу. Отметим, что функция breadth. firsLsearch использует процедуру btq.destroy для освобождения пространства, занимаемого создаваемой очередью. Если это не будет сделано, то память, занимаемая элементами локальной переменной q, была бы поте-
lunction breadth Jiist ^search (bt: intbiiitree; е: integer.): boolean; var q: btq; t: intbintree; found: boolean; begin found ;= false; if not (btJsempty (bt)) then begin q := btq_new; btq_append (q, btq);
while (not (btqJsempty (q)) and not (found)) do begin t := btq_re;nfirst (q); if bt.rootval (t) == e then found :== true else begin if not (btJsempty (bt.left (t))) then btq_append (q, btJeft (t)); if not (btJsempty (bt_right (t))) then btq_append (q, bt_right (t))! end end btq .destroy (q) end;
breadthJirst-search :== found end {функция breadthJirst_search}
Рис. 7.13. Реализация функции breadth, first, search,
ряна. С другой стороны, нет обращения к процедуре bt.destroy (t). Прежде чем выйти из операции, мы должны вызвать процедуру destroy для освобождения тех объектов, которые были выделены динамически в процессе работы этой функции. Хотя функция breadth.first. search делает объявление локальной переме « ной типа бинарного дерева целых чисел intbintree, она не создает ни одного объекта данного типа.
Теперь у нао есть все части, необходимые для получения функции поиска в ширину, которую можно было бы вставить в большую программу. Способ, которым мы объединим эти части, зависит от используемого языка Паскаль. Во многих диалектах языка Паскаль (включая и стандартный язык Паскаль) порядок объявления переменных внутри блока имеет ограничения — сперва делаются все объявления const. затем все объявления type, далее все объявления var и, наконец, все объявления операций. Из этого еледует, что объявление представления некоторого абстрактного типа не будет соседствовать с реализациями операций над данным типом.
Далее мы предполагаем, что используем язык Паскаль, в котором снято это ограничение и допускается любой порядок объявлений. Если для языка Паскаль, у которого более строгие ограничения, надо затратить большие усилия по программированию,
