
- •Тема 6. РЕШЕНИЕ ЗАДАЧ С
- •Задача вычисления арифметических выражений
- •Обратная польская запись
- •Описание класса для расшифровки и вычисления арифметических выражений
- •пояснения
- •Метод AV(strp:string)
- •Алгоритм вычисления выражения в ОПЗ
- •Алгоритм вычисления выражения в ОПЗ
- •Метод AV (начало)
- •Метод AV (продолжение)
- •Пример вычисления выражения
- •Метод
- •Алгоритм преобразования выражения из инфиксной формы в форму ОПЗ
- •Формулировка алгоритма
- •Формулировка алгоритма
- •стек
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Пример перевода в ОПЗ
- •Программная реализация алгоритма Дейкстры (начало)
- •Программная реализация алгоритма Дейкстры
- •Программная реализация алгоритма
- •Программная реализация алгоритма
- •Сложение больших целых чисел
- •Заметим, что перевернуть список довольно просто
- •Пример алгоритма сложения
- •Описание используемого класса
- •Контрольные вопросы на экзамене
- •Задача 11 на экзамен
- •Задача 12 на экзамен
Метод 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 |
|
|
|
|
|
|
|