Список пуст? | ||
Список атом? | ||
VAL=p^.атом | x=VAL(Голова(p)) | |
оп=Голова(p)^.атом | ||
y=VAL(Голова(p)) | ||
если оп=+ VAL=x+y | ||
если оп=- VAL=x-y | ||
если оп=* VAL=x*y | ||
если оп=/ VAL=x/y |
Разъяснения:
Вот «правильный» линейный список
x=VAL(Голова(p)). Вот результат применения функции Голова:
оп=Голова(p)^.атом. Вот результат второго применения функции Голова:
y=VAL(Голова(p)). Вот результат третьего применения функции Голова:
Задача
Имеется правильное выражение в виде строки. Построить линейный список для этого выражения.
pElem=^Elem;
Elem=record
след:pElem;
case R:0..1 of
0: (уров:pElem);
1: (атом:T)
end;
Выражение вводится с клавиатуры.
procedure LS (var p:pElem);
var c:char;
begin
if not eoln
begin
read(c);
case c of
‘(‘: begin
new(p); p^.R:=0; LS(p^.уров); LS(p^.след);
end;
‘a’..’z’,’+’,’-‘,’*’,’/’: begin
new(p); p^.R:=1; p^.атом:=с; LS(p^.след);
end;
‘)’: p:=nil;
end;
end
else p:=nil;
end;
Задачи
1) Написать алгоритм вычисления значения арифметического выражения, используя операцию "расчленение".
2) Имеется линейный список для "правильного" арифметического выражения. Построить линейный список для обратной польской записи этого выражения.
3) Построить алгоритм обхода элементов линейного списка (восстановить строку символов с учетом вложенности).