Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOS / Дисциплины программистского цикла.doc
Скачиваний:
53
Добавлен:
09.05.2015
Размер:
1.51 Mб
Скачать

4. Моделирование линейных динамических информационных структур средствами высокого уровня

В Pascal нет специальных типов данных, соответствующих стеку, очереди, деку, поэтому применяют моделирование.

Модель такой структуры данных содержит информационную составляющую для хранения узлов ЛДИС и операционную составляющую, т. е. набор процедур и операций, выполняющих операции над структурой данных.

Моделирование стека.

Опишем следующие определения:

Const max = 100;

Type Ind = 1..max;

Pnt = 0..max;

Node = record … end;

Stek = record

Top: pnt;

S: array [Ind] of Node; end;

{создание пустого стека}

Procedure InitStek (var st: stek);

Begin

With st do top:=0;

End;

{добавление узла}

Procedure InitStek (var st: stek; x: Node);

Begin

With st do

If top=max then write (‘perepolneno’)

Else begin

Top:= top+1;

S[top]:= x;

End;

End;

Аналогично описываются функции «стек не пуст» и процедура извлечения элемента из стека.

Моделирование очереди.

Состоит в использовании массива и двух переменных, указывающих на начало и конец очереди.

Начало на 2-ом элементе, конец на 4-ом. Признаком

Пустоты очереди является выражение k<N. Т.к. в

Начальный момент времени все элемент ы массива Q

Свободны, то N=1, k=0.

Const max = 100;

Type Ind = 1..max;

Pnt = 0..max;

Ind1 = 1..max;

Node = record … end;

Qn = record

k: pnt;

N: Ind1;

Q: array [Ind] of Node; end;

Procedure InitQn(var Qe: Qn);

Begin

With Qe do begin

N:= 1;

K:= 0; end;

End;

Procedure InQn (var Qe: Qn; x: Node);

Var i: Ind;

Begin

If Qe.k = max then

If Qe.N = 1 then writeln(‘perepolnenie’)

Else else

Begin

For i:=1 to (max-N+1) do Q[i]:= Q[i+N-1];

K:= max – N+1; N:=1;

End;

K:=k+1;

Q[k]:=x;

End;

Procedure OutQn(var Qe: Qn; var x: Node);

Begin

With Qe do if k<N then write (‘ochered pusta)

Else

Begin

X:= Q[N];

N:=N+1;

End;

End;

Аналогично описывается опрерация «очередь не пуста».

5. Рекурсивные процедуры обхода двоичных деревьев.

Двоичное дерево-это конечное множество элементов Т, которое или пусто, или в нем может быть выделен элемент r(корень дерева) и два непересекающихся подмножества и

, каждое из которых является двоичным деревом. Каждый элемент множества Т находится либо в, либо в,либо в r.

Лист – такой элемент, для которого леевое и правое поддеревья - пустые подмножества.

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

1.Прямой обход (Preorder):

а)посетить корень;

б)посетить левое поддерево прямым обходом;

в)посетить правое поддерево прямым обходом;

2.Обратный обход (Inorder):

а)посетить левое поддерево обратным обходом;

б)посетить корень;

в)посетить правое поддерево обратным обходом;

3.Концевой обход (Postorder):

а)посетить левое поддерево концевым обходом;

б)посетить правое поддерево концевым обходом;

в)посетить корень.

_______________

type ptr=^node;

node=record

info:char;llink,rlink:ptr;

end;

Procedure Preorder(p:ptr);

Begin if p<>nil then

Begin write(p^. info);

Preorder(p^. llink);

Preorder(p^. rlink);

End;end{ Preorder };

************************

Procedure Inorder(p:ptr);

Begin if p<>nil then

Begin Inorder(p^.llink);

write(p^. info);

Inorder(p^. rlink);

End; end{Inorder};

************************

Procedure Postorder(p:ptr);

Begin if p<>nil then

Begin Postorder(p^.llink);

Postorder(p^. rlink);

write(p^. info);

End; end{ Postorder }.