| Россия |
Алгоритмы на абстрактных структурах данных
Программа 2. Ханойская башня.
На стержне
в исходном порядке находится
дисков, уменьшающихся по размеру снизу вверх. Диски должны быть переставлены
на стержень в исходном порядке при использовании в случае необходимости
промежуточного стержня
для временного хранения дисков. В
процессе перестановки дисков обязательно
должны соблюдаться правила: одновременно может быть переставлен только один
самый верхний диск ( с одного из стержней на другой); ни в какой момент времени
диск не может находиться на другом диске меньшего размера.
Программа реализована с помощью абстрактного типа данных – стек для произвольного числа дисков.
{Программа написана на языке программирования Turbo-Pascal}
uses crt,graph;
type PEl=^El;
El=record
n:byte;
next:PEl;
end;
var ster:array[1..3] of PEl;
number: byte;
p:PEl;
th,l: integer;
i:integer;
nhod:word;
s:string;
procedure hod(n,f,t:integer);
begin
if n>1 then begin
hod(n-1,f,6-(f+t));
hod(1,f,t);
hod(n-1,6-(f+t),t);
end else begin
p:=ster[f];
ster[f]:=ster[f]^.next;
p^.next:=ster[t];
ster[t]:=p;
inc(nhod);
str(nhod,s);
{**********************************************************}
setfillstyle(1,0);bar(0,0,50,10);
setcolor(2);outtextxy(0,0,s);
setfillstyle(1,0);setcolor(0);p:=ster[f];i:=1;
while p<>nil do begin p:=p^.next;inc(i);end;
fillellipse(160*f,460-(i-1)*th,(number-ster[t]^.n+1)*l,10);
setfillstyle(1,4);setcolor(4);p:=ster[t];i:=1;
while p<>nil do begin fillellipse(160*t,460-(i-1)*th,(number-
ster[t]^.n+1)*l,10);inc(i);p:=p^.next;end;
{**********************************************************}
{ readkey;}{delay(50);}
end;
end;
procedure start;
var i:integer;grD,grM: Integer;
begin
clrscr;write('Enter the number of rings, please.');readln(number);
for i:=1 to 3 do ster[i]:=nil;
for i:=1 to number do begin new(p);p^.n:=i;p^.next:=ster[1];ster[1]:=p;end;
nhod:=0;
grD:=Detect;{InitGraph(grD,grM,'');}InitGraph(grD,grM,'c:\borland\tp\bgi');
th:=20;l:=round(50/number);
setfillstyle(1,4);setcolor(4);
for i:=1 to number do begin fillellipse(160,460-(i-1)*th,(number-
i+1)*l,10);end;
end;
begin
start;
{readkey;}
hod(number,1,3);
{closegraph;}
end.Очереди
Очередь - одномерная структура данных, для которой загрузка или извлечение элементов осуществляется с помощью указателей начала извлечения (head) и конца (tail) очереди в соответствии с правилом FIFO ("first-in, first-out" - "первым введен, первым выведен").
- Начальная установка:
Head:=1; tail:=1;
- Добавление элемента x:
Queue[tail]:=x; tail:=tail+1; If tail>qd then tail:=1; Здесь qd - размерность очереди.
- Исключение элемента x:
x:=queue[head]; head:=head+1; if head>qd then head:=1;
- Проверка переполнения очереди и включение в нее элемента:
Temp:=tail+1;
If temp>qd then temp:=1;
If temp=head then \{переполнение\}
Else btgin queue[tail]:=x; tail:=temp end;- Проверка элементов и исключение элемента:
If head:=tail then
\{очередь пуста\}
else begin
x:=queue[head]; head:=head+1;
if yead>qd then head:=1;
end;Отметим, что при извлечении элемента из очереди все элементы могут также перемещаться на один шаг к ее началу.