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

Метод AV (продолжение)

else begin

stec.Read1(ch2); stec.Read1(ch1);

op1:=zn[ch1];

op2:=zn[ch2];

case ch of

 

’+’:rez:=op1+op2;

’-’:rez:=op1-op2;

’*’:rez:=op1*op2;

’/’:rez:=op1/op2;

’^’:rez:=power(op1,op2);

end;

 

end;

 

zn[chr]:=rez;

 

stec.Add1(chr); Inc(chr);

end; // for

Result:=rez; stec.Free;

end;// AV

07/02/19

11

Пример вычисления выражения

Var pz:Tpz;

...

Begin

pz:=Tpz.create;

pz.zn[’a’]:=0.1;

pz.zn[’b’]:=5.2;

pz.zn[’c’]:=2.4;

pz.zn[’d’]:=6;

pz.zn[’e’]:=8.4;

write(pz.AV(’ab+cd+*e-’));

pz.free;

end;

07/02/19

12

Метод

OBP(Var stri,strp:string);

преобразует выражение в инфиксной форме в форму ОПЗ.

stri:=’(a+b)*c’;

OBP(stri,strp);

В strp будет ’ab+c*’

07/02/19

13

Алгоритм преобразования выражения из инфиксной формы в форму ОПЗ

был предложен голандцем Эдгером Вайб Дейкстрой –автором идеи структурного программирования.

На вопрос «Умеет ли ВМ думать?» он отвечал вопросом «Умеет ли подводная лодка плавать?»

При реализации алгоритма вводится понятие стекового приоритета операций:

Операции

)(

+ –

*/

^

Приоритет

0

1

2

3

07/02/19

14

Формулировка алгоритма

Просматривается слева направо исходная строка символов, в которой записано выражение в инфиксной форме

’(a+b)*(c+d)-e’

причем операнды переписываются в выходную строку в

которой формируется постфиксная форма выражения,

а знаки операций заносятся в стек или выталкиваются из него в выходную строку следующим образом:

07/02/19

15

Формулировка алгоритма

1) Если стек пуст, то операция записывается в стек;

2) Открывающаяся скобка дописывается в стек;

3) Закрывающая скобка выталкивает в выходную строку все операции из стека до ближайшей открывающейся скобки, сами скобки уничтожаются;

4) Если стек не пуст, то очередная операция выталкивает в выходную строку все операции из стека с большим чем у нее или равным приоритетом причем сама дописывается в стек;

5) Если после выборки из исходной строки последнего символа в стеке остались операции, то все они выталкиваются в выходную строку.

07/02/19

16

стек

+

Пример перевода в ОПЗ

a+b

Выходная строка

 

a

 

 

 

 

 

a

b

 

 

 

 

a

b

+

07/02/19

17

Пример перевода в ОПЗ

a+b-c

+

-

a

 

 

 

 

 

a

b

 

 

-

 

a

b

+

 

 

 

a

b

+

c

 

 

a

b

+

c -

07/02/19

18

Пример перевода в ОПЗ

(a+b^c)*d

( + ^

)

a

 

 

 

 

 

 

 

a

b

 

 

 

 

 

 

a

b

c

 

 

 

 

 

a

b

c

^

+

 

*

 

a

b

c

^

+

d

 

 

 

 

a

b

c

^

+

d *

07/02/19

19

Пример перевода в ОПЗ

стек

 

 

d*((a+b)*c-e)

 

Выходная строка

 

 

 

 

 

 

 

 

 

 

*

(

(

+

)

d

 

 

 

 

 

 

 

 

 

 

 

d

a

 

 

 

 

 

*

(

*

-

 

d

a

b

 

 

 

 

 

 

 

 

 

d

a

b

+

 

 

 

*

(

-

)

 

d

a

b

+

c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d

a

b

+

c

*

 

*

 

 

 

 

d

a

b

+

c

*

e

 

 

 

 

 

 

 

 

 

 

d

a

b

+

c

*

e -

 

 

 

07/02/19

d a b + c

*

e

-

*

 

 

20