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

Тема 6. РЕШЕНИЕ ЗАДАЧ С

ИСПОЛЬЗОВАНИЕМ ЛИНЕЙНЫХ СВЯЗАННЫХ СПИСКОВ

Задача вычисления

арифметических выражений

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

чисел

07/02/19

1

Задача вычисления арифметических выражений

Одной из задач при разработке трансляторов является задача расшифровки арифметических выражений, например, вида:

r:=(a+b)*(c+d)-e;

Запись выражения вида a+b называется инфиксной формой,

a и b операнды, + операция.

Возможны также другие формы записи этого выражения:

+ab префиксная,

ab+ постфиксная.

В наиболее распространенной инфиксной форме для указания последовательности выполнения операций необходимо

расставлять скобки.

07/02/19

2

Обратная польская запись

Польский математик Я. Лукашевич обратил внимание на тот факт, что при записи выражений в постфиксной форме ab+ скобки не нужны, а последовательность операндов и операций удобна для расшифровки основанной на применении эффективных методов.

Поэтому постфиксная запись выражений получила название

обратной польской записи (ОПЗ).

Например, вышеприведенное выражение

r=(a+b)*(c+d)-e;

в ОПЗ r=ab+cd+*e;

r=a+b-c; ab+c-

r=c*(a+b-c); cab+c-*

Конечно, эти выражения менее наглядны и плохо

воспринимаются с непривычки, однако как мы увидим далее, они очень удобны для вычислений

07/02/19

3

Описание класса для расшифровки и вычисления арифметических выражений

Используем класс TList, в котором

Type Tinf=Char;

Поиск нам не нужен, поэтому нет Key

Нам понадобятся методы работы со стеком:

Create, Read1, Add1

Type

Tpz=class(TList)

zn:array[’a’..’я’]of extended;

 

stec:Tlist;

 

Procedure OBP(Var stri,strp:string);

 

Function AV(strp:string):extended;

 

End;

4

 

07/02/19

пояснения

Для простоты используем однобуквенные операнды a – z в выражениях. Символы, расположенные после z используем как промежуточные.

Если имеется выражение a+b, то задание значений производится следующим образом

zn[’a’]:=2.5;zn[’b’]:=4;

07/02/19

5

Метод AV(strp:string)

вычисляет значение выражения, записанного в ОПЗ:

Var strp:string; r:extended; pz:Tpz;

zn[’a’]:=2.5;

zn[’b’]:=4;

strp:=’ab+’;

r:=pz.AV(strp);

В r будет 6.5

07/02/19

6

Алгоритм вычисления выражения в ОПЗ

основан на использовании стека.

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

В результате для каждой операции, относящиеся к ней операнды будут двумя верхними элементами стека.

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

07/02/19

7

Алгоритм вычисления выражения в ОПЗ

R:=ab+c*

a b

+

a

+ b

д

д

 

 

 

 

д с

*

д + с

ж

ж

Результат находится в ж

07/02/19

8

 

Еще пример

R:= ab+cd+*e;

 

 

 

a b

+

a + b

д

д

 

 

 

 

д c d

+

c + d

ж

д ж

д ж

*

д * ж

з

з

з e

-

з * e

и

и

Результат находится в

и

07/02/19

9

Метод AV (начало)

Function Tpz.AV(strp:string):extended;

Var ch,ch1,ch2,chr:char;

op1,op2,rez:extended;

begin

stec:=Tlist.create;

chr:=Succ(’z’); //следующий за ’z’ символ

for i:=1 to Length(strp) do

begin

ch:=strp[i];

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

then stec.Add1(ch)

else

 

07/02/19

10