Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

Листинг 9.11. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ просачиваниС Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ


procedure TtdPriorityQueueEx.pqTrickleDown(aHandle : TtdPQHandle);

var

FromInx : integer;

MaxInx : integer;

ChildInx : integer;

ChildHandle : PpqexNode;

Handle : PpqexNode absolute aHandle;

begin

{Ссли Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ элСмСнт мСньшС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· своих Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами с большим Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ процСсс ΠΈΠ· Π½ΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ}

FromInx := Handle^.peInx;

MaxInx := pred(FList.Count);

{Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ индСкс Π»Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΡƒΠ·Π»Π°}

ChildInx := succ(FromInx * 2);

{Ссли имССтся ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ индСкс большСго Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ элСмСнта...}

while (ChildInx <= MaxInx) do

begin

{Ссли Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π», Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ индСкс наибольшСго Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΡƒΠ·Π»Π°}

if ((ChildInx+1) <= MaxInx) and

(FCompare(PpqexNode(FList.List^[ChildInx])^.peItem, PpqexNode(FList.List^[ChildInx+ 1])^.peItem) < 0) then

inc(ChildInx);

{Ссли элСмСнт большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ элСмСнту, Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°}

ChildHandle := PpqexNode(FList.List^[ChildInx]);

if (FCompare (Handle^.peItem, ChildHandle^.peItem) >= 0) then

Break;

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС больший Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ, Π° сам элСмСнт - Π²Π½ΠΈΠ·}

FList.List^[FromInx] ChildHandle;

ChildHandle^.peInx := FromInx;

FromInx := ChildInx;

ChildInx := succ(FromInx * 2);

end;

{ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ элСмСнт Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ}

FList.List^[FromInx] := Handle;

Handle^.peInx := FromInx;

end;


function TtdPriorityQueueEx.Dequeue : pointer;

var

Handle : PpqexNode;

begin

{ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ}

if (FList.Count = 0) then

pqError(tdeQueueIsEmpty, 'Dequeue');

{Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· списка дСскрипторов}

Handle := FList.List^[0];

Result := Handle^.peItem;

DeleteLinkedListNode(FHandles, Handle);

{Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ содСрТала Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½Π° пуста}

if (FList.Count = 1) then

FList.Count := 0

{Ссли ΠΎΠ½Π° содСрТала Π΄Π²Π° элСмСнта, Π½ΡƒΠΆΠ½ΠΎ просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом свойство ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сохраняСтся}

else

if (FList.Count = 2) then begin

Handle := FList.List^[1];

FList.List^[0] := Handle;

FList.Count := 1;

Handle^.peInx := 0;

end

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС свойство ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ восстановлСния}

else begin

{Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ, располоТСнным Π² самой Π½ΠΈΠΆΠ½Π΅ΠΉ, ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ справа ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ списка; Π·Π°Ρ‚Π΅ΠΌ Π·Π° счСт примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° просачивания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ дальшС Π²Π½ΠΈΠ· ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ}

Handle := FList.Last;

FList.List^[0] := Handler-Handle^.peInx := 0;

FList.Count := FList.Count - 1;

pqTrickleDown(Handle);

end;

end;


ПослС ознакомлСния с опСрациями постановки Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ ChangePriotity ΠΊΡ€Π°ΠΉΠ½Π΅ прост. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½, класс ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ элСмСнта Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ провСряСт, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ элСмСнт Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт, ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ большС Π»ΠΈ элСмСнт с Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ своСго Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ элСмСнта. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ элСмСнт пСрСмСщаСтся Π²Π²Π΅Ρ€Ρ… Π·Π° счСт примСнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠ³ΠΎ подъСма. Если опСрация ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠ³ΠΎ подъСма Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ»ΠΈ Π½Π΅ трСбуСтся, ΠΌΠ΅Ρ‚ΠΎΠ΄ провСряСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ просачивания.

Листинг 9.12. ВосстановлСниС свойства ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ послС измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°


procedure TtdPriorityQueueEx.ChangePriority(aHandle : TtdPQHandle);

var

Handle : PpqexNode absolute aHandle;

ParentInx : integer;

ParentHandle : PpqexNode;

begin

{ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠ³ΠΎ подъСма}

if (Handle^.peInx > 0) then begin

ParentInx := (Handle^.peInx - 1) div 2;

ParentHandle := PpqexNode(FList[ParentInx]);

if (FCompare( Handle^.peItem, Parent Handle^.peItem) > 0) then begin

pqBubbleUp(Handle);

Exit;

end;

end;

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ просачивания}

pqTrickleDown(Handle);

end;


ПослСдняя опСрация рСализуСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Remove. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ элСмСнт, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ дСскриптором, Π° Π·Π°Ρ‚Π΅ΠΌ замСняСм Π΅Π³ΠΎ послСдним элСмСнтом ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. ДСскриптор удаляСтся ΠΈΠ· связного списка. Π­Ρ‚Π° опСрация упрощаСтся благодаря использованию двусвязного списка. Π—Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика элСмСнтов Π² ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° процСсс ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совпадаСт с процСссом измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, поэтому ΠΌΡ‹ просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Листинг 9.13. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅Π³ΠΎ дСскриптором


function TtdPriorityQueueEx.Remove(aHandle : TtdPQHandle): pointer;

var

Handle : PpqexNode absolute aHandle;

NewHandle : PpqexNode;

HeapInx : integer;

begin

{Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ элСмСнт, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ дСскриптор}

Result := Handle^.peItem;

HeapInx := Handle^.peInx;

DeleteLinkedListNode(FHandles, Handle);

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» ΡƒΠ΄Π°Π»Π΅Π½ послСдний элСмСнт. Если это Ρ‚Π°ΠΊ, Π½ΡƒΠΆΠ½ΠΎ просто ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° - ΠΏΡ€ΠΈ этом свойство ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ сохранСно}

if (HeapInx = pred(FList.Count)) then

FList.Count := FList.Count - 1

else begin

{Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ элСмСнт ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ элСмСнтом, располоТСнным Π² самой Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ справа ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ списка}

NewHandle := FList.Last;

FList.List^[HeapInx] := NewHandle;

NewHandle^.peInx := HeapInx;

FList.Count := FList.Count - 1;

{дальнСйшиС дСйствия ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°}

ChangePriority(NewHandle);

end;

end;


ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ этого класса ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². ПослС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΎΡ‚Ρ‹Ρ‰ΠΈΡ‚Π΅ срСди Π½ΠΈΡ… Ρ„Π°ΠΉΠ» TDPriQue.pas.

РСзюмС

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΡƒΠ΄Π΅Π»ΠΈΠ»ΠΈ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ очСрСдям ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ - очСрСдям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π΅ самый ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π² Π½ΠΈΡ… элСмСнт, Π° элСмСнт с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. ИсслСдовав нСсколько простых Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, ΠΌΡ‹ ознакомились с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰Π΅ΠΉ использованиС ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. ΠœΡ‹ рассмотрСли Π±Π°Π·ΠΎΠ²Ρ‹Π΅ свойства ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Π² ΠΊΠ°ΠΊ Π² качСствС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΠΉ сортировки, Ρ‚Π°ΠΊ ΠΈ для удовлСтворСния ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ трСбования, ΠΏΡ€Π΅Π΄ΡŠΡΠ²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ для обСспСчСния выполнСния ряда Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: удалСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта ΠΈ измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта. ΠœΡ‹ выяснили, ΠΊΠ°ΠΊΠΈΠ΅ измСнСния Π½ΡƒΠΆΠ½ΠΎ внСсти Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π“Π»Π°Π²Π° 10. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹ ΠΈ рСгулярныС выраТСния.

БущСствуСт Ρ†Π΅Π»Ρ‹ΠΉ класс ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π²Ρ‚ΠΎΡ€ΡƒΡ‡ΠΊΠΈ ΠΈ Π±ΡƒΠΌΠ°Π³ΠΈ. По-ΠΌΠΎΠ΅ΠΌΡƒ, это Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ аспСкт программирования: ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ графичСски ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ процСсс, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Π― имСю Π² Π²ΠΈΠ΄Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹.

ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° рассмотрСнных Π² этой ΠΊΠ½ΠΈΠ³Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹ - это Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΏΡ€ΠΈΠ·Π²Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². Они слуТат срСдством достиТСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ - Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΎΠ½ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ рядом интСрСсных особСнностСй. Π’ основном ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° (parsing algorithm). БинтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ считываниС строки (ΠΈΠ»ΠΈ тСкстового Ρ„Π°ΠΉΠ»Π°) ΠΈ Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ символов Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ лСксСмы. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт синтаксичСский Π°Π½Π°Π»ΠΈΠ·, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ (parser).

ИспользованиС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°: синтаксичСский Π°Π½Π°Π»ΠΈΠ·

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ вСсь процСсс, рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ трСбуСтся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ слова ΠΈΠ· строки тСкста. Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡ‹Π΅ слова Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² список строк. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ строки тСкст, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, воспринимался ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ слово. Π’.Π΅., Ссли имССтся строка:

НС said, "State machines?"

ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°ΠΊΠΈ прСпинания ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

НС

said

"State machines?"

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ тСкста ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - использованиС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ (state machine) - это систСма (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ цифровая), которая ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ состояния Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π² соотвСтствии с ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΌΠΈ Сю Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (сигналами). Π‘ΠΌΠ΅Π½Π° состояний называСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ (trAnsition). ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊ-схСмой. Π‘Π»ΠΎΠΊ схСма рассматриваСмого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 10.1.

ΠŸΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рисункС ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ состояния: А, Π’ ΠΈ Π‘. Π Π°Π±ΠΎΡ‚Π° Π±Π»ΠΎΠΊ-схСмы начинаСтся с состояния A. Π’ этом состоянии выполняСтся считываниС символа ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки. Если этот символ - двойная ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°, осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² состояниС Π’. Если символ являСтся ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ ΠΈΠ»ΠΈ Π·Π½Π°ΠΊΠΎΠΌ прСпинания, выполняСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² состояниС Π‘. Если это любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ символ, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ остаСтся Π² состоянии А (это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠ΅Ρ‚Π»Π΅ΠΉ).

ПослС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² состояниС Π’ считываниС символов продолТаСтся Π² Π½Π΅ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ считан символ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ происходит ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² состояниС A.