Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_26_27_Задачи с использ стеков.ppt
Скачиваний:
20
Добавлен:
11.05.2015
Размер:
139.78 Кб
Скачать

Программная реализация алгоритма Дейкстры (начало)

Procedure Tpz.OBP(Var stri,strp:string);

Function prior(ch:char):byte;

begin

case ch of

(’,’)’:prior:=0;

+’,’-’:prior:=1;

*’,’/’:proir:=2;

^’:proir:=3;

end;

end;

Var pc:0..3;

i:byte;ch,ch1:char;

07/02/19

21

Программная реализация алгоритма Дейкстры

(продолжение1)

begin strp:=’’;

stek:=Tlist.create;

for i:=1 to length(stri) do

begin

ch:=stri[i];

if not ch in[’+’,’-’,’*’,’/’,’(’,’)’,’^’]

then

strp:=strp+ch//операнд в строку

else //операция

if stek.sp1=Nil then stec.Add1(ch)// стек пуст 1)

else

 

if ch=’(’then stec.Add1(ch) //откр. Скобка 2)

else

 

if ch=’)’then // выталкиваем все операции 3)

07/02/19

22

Программная реализация алгоритма

Дейкстры (продолжение2)

// выталкиваем все операции 3)

begin

stec.Read1(ch);

While ch<>’(’do //до ближайшей (

begin

strp:=strp+ch;// в strp

stec.Read1(ch);

End

End

else //ch=+ - * / ^

begin // выталкивание более приоритетных 4)

07/02/19

23

Программная реализация алгоритма

Дейкстры (продолжение3)

// выталкивание более приоритетных 4)

pc:=prior(ch);

While (stek.sp1<>Nil) and

(pc<= prior(stek.sp1.Inf)) do

begin

stec.Read1(ch1);

strp:=strp+ch1;

end;

stec.Add1(ch); // добавить после выталкивания

end;

end;//for выталкивание оставшихся операций 5)

While stek.sp1<>nil do begin stec.Read1(ch);

strp:=strp+ch end;

end;//OBP

07/02/19

24

Сложение больших целых чисел

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

Число Р, содержащее n разрядов можно представить в виде

односвязного списка sp1 (стек) из отдельных цифр этого числа, причем единицы находятся в конце списка. Так число Р=1256 будет размешено следующим образом (перевернуто!):

sp1

6

A

 

 

5

A

 

 

2

A

 

 

1

nil

 

 

 

 

07/02/19

25

Заметим, что перевернуть список довольно просто

Var stk1, stk2:Tlist;

Var Inf:Tinf;

Begin

. . . .

Stk2:=Tlist.create;

While stk1.sp1<>nil do begin

Begin

stk1.Read1(inf);

stk2.Add1(inf);

End;

07/02/19

26

Пример алгоритма сложения

u=

+

v=

w=

07/02/19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

1

 

9

 

8

 

4

 

3

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

 

 

 

 

 

 

9

 

5

 

2

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s= 0 или 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

 

 

 

 

 

3

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

6

 

9

 

7

 

0

 

2

 

 

 

 

 

 

 

 

 

 

Нужно перевернуть!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sp1

 

 

 

2

 

0

 

7

 

9

 

6

 

3

 

 

 

27

 

 

 

 

 

 

 

 

 

 

Описание используемого класса

Воспользуемся классом TList (стек), в котором тип

информационной ячейки TInf=byte (ключ отсутствует)

Нам понадобятся методы Read1, Add1

Исходные и полученое числа размещаются в стеках:

Var u, v, w:Tlist; // три стека

после сложения числа в списках u и v сохраняются

07/02/19

28

 

Метод сложения больших чисел

Procedure // q=2-10 основание системы счисления

TListTrn.SmB(u,v:Tlist;var w:Tlist;q:byte);

Var s:0..1; t:0..19;

begin

w:=Tlist.create;

s:=0; // s=0 или 1- перенос

u.sp:=u.sp1; v.sp:=v.sp1;

While (u.sp<>Nil) and (v.sp<>Nil) do

begin

t:=u.sp^.Inf+ v.sp^.Inf+s;

w.Add1(t mod q); //остаток

s:=t div q;

//разряд

u.sp:=u.sp^.A; v.sp:=v.sp^.A;

end;

07/02/19

29

While u.sp<>Nil do

//продолжение

begin

t:=u.sp.Inf+s;

w.Add1(t mod q);

s:=t div q;

u.sp:=u.sp^.A;

end;

While v.sp<>Nil do

begin

t:=v.sp.Inf+s;

w.Add1(t mod q);

s:=t div q;

v.sp:=v.sp^.A;

end;

if s>0 then w.Add1(s);

end;//smb

07/02/19

30