Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Технология программирования.doc
Скачиваний:
20
Добавлен:
11.06.2015
Размер:
1.69 Mб
Скачать

Понятие очереди и дека, их организация

Очередью (англ. Queue) называется последовательность, удалять из которой можно только первый элемент, а добавлять только после последнего. Эта хорошо известная во многих областях жизни структура имеет специальную аббревиатуру FIFO (First In – First Out, Первый войдёшь – первый выйдешь). Очередь хорошо реализуется двухсвязным списком. Рассмотрим функции создания очереди из массива createQue, включения в очередь inQue и удаления из очереди outQue.

function createQue(A)

{return toList2(A)

};

function outQue(D)

{return delNext2(D,D)

};

function inQue(E, D)

{if (D.last==null) insAfter2(E,D,D)

else insAfter2(E,D.last,D)

}

Дек – это последовательность, для которой удаление и вставка элементов возможна с обоих концов (deque – double-ended queue, очередь с двумя концами). Дек также хорошо реализуется двухсвязным списком. Функции для этих операций нетрудно написать аналогично приведенным выше функциям для очередей.

Понятие дерева как ссылочной структуры. Бинарные деревья. Представление дерева литералом

Деревом называется такая ссылочная структура, в которой на каждый объект может ссылаться только один, другой объект. Объекты дерева называются обычно узлами или вершинами. Узел, на который нет ссылок, называется корнем дерева. Узлы, которые не ссылаются на другие узлы, называются листьями. В программировании деревья рисуют, как правило, корнем вверх. Принято также говорить, что ссылка ведёт от родительского узла к дочернему. В этом смысле узлы могут быть потомками и предками других узлов, причём у каждого узла (кроме корня) ровно один родительский узел.

Примером простейшего дерева является односвязный список (у каждого родительского узла только один дочерний узел). Двухсвязный список деревом не является. Если в объектной модели HTML-страницы рассматривать только ссылки от родителей к детям, то получится дерево. Но реально DOM содержит ещё производные ссылки от младшего брата к старшему и от сына к отцу. Поэтому DOM можно считать деревом лишь условно.

Дерево называется бинарным, если у каждого родительского узла не более двух дочерних. Бинарные деревья очень часто используются в программистской практике. Каждый узел бинарного дерева имеет два поля, содержащих ссылки на дочерние узлы. Если дочернего узла нет, вместо ссылки поле содержит значение, не являющееся ссылкой, например null.

Дерево может иметь дескриптор, ссылающийся на корень, если нужно динамически добавлять и удалять узлы (аналогично односвязному списку). Здесь такие операции не рассматриваются, поэтому дескриптор не понадобится.

Примером бинарного дерева является генеалогическое дерево человека. Пусть каждый узел представлен записью

{man: сведения_о_человеке, f: его_отец, m: его_мать}

Поля f и m содержат ссылки на узлы родителей человека. Если какой-то из родителей неизвестен, вместо ссылки в соответствующем поле будет null. Любое дерево может быть записано на языке JavaScript в виде литерала-записи. Например:

{man: "Иван",

f: {man: "Пётр",

f: {man: "Павел",

f: {man: "Алексей",

f: null,

m: null},

m: null},

m: {man: "Мария",

f: null,

m: null}},

m: {man: "Ирина",

f: null,

m: {man: "Елена",

f: null,

m: null}}}

Графическое изображение этого дерева может быть таким, как на рис. 10. В нём имена ссылочных полей записаны прямо на стрелках. Если это не приводит к путанице (при определённых соглашениях), имена полей можно и не приводить.

Рис. 10. Бинарное генеалогическое дерево.