program ex9;
type
tf = text;
t = ^zap;
zap = record
el: char;
sled, pred: t;
end;
m = set of char;
procedure create(var f1: tf; var sp1: t);
var
zv, zv1: t;
begin
reset(f1);
new(zv);
sp1 := zv;
while not eof(f1) do
begin
read(f1, zv^.el);
new(zv^.sled);
zv1 := zv;
zv := zv^.sled;
zv^.pred := zv1;
zv^.sled := nil;
end;
close(f1);
end;
procedure print(var fp: tf; spp: t);
var
zv: t;
begin
zv := spp;
writeln(fp, 'Прямо');
while zv^.sled <> nil do
begin
write(fp, zv^.el);
zv := zv^.sled;
end;
writeln(fp);
writeln(fp, 'Обратно');
while zv <> spp do
begin
zv := zv^.pred;
write(fp, zv^.el);
end;
end;
procedure correct(var f2: tf; sp2: t; var er: boolean);
var
p: m;
zv: t;
k: integer;
begin
zv := sp2;
er := false;
k := 0;
while zv^.sled <> nil do
begin
if zv^.el = '(' then
k := k + 1;
if zv^.el = ')' then
k := k - 1;
zv := zv^.sled;
end;
if k <> 0 then
begin
er := true;
writeln(f2);
writeln(f2, 'При проверке обнаружена ошибка ');
end;
end;
procedure prefix(var f3: tf; sp3: t; er1: boolean);
var
zv, zv1, kz: t;
mz, ms: m;
c: char;
i: integer;
bl: boolean;
begin
if er1 = true then
exit;
writeln(f3);
writeln(f3, 'Префиксная форма ');
i := 0;
mz := ['-', '+', '*', '/'];
ms := ['(', ')'];
zv := sp3;
repeat
begin
zv := zv^.sled;
if zv^.el in mz then
bl := true;
end;
until (bl = true) and (zv^.pred^.el = ')') and (zv^.sled^.el = '(');
kz := zv;
write(f3, kz^.el);
zv := sp3;
while zv^.sled <> nil do
begin
if zv = kz then
bl := true
else
bl := false;
if (zv^.el in mz) and (bl = false) then
begin
write(f3, zv^.el);
zv1 := zv^.pred;
if (zv1^.el in ms) or (zv1 = kz) then
c := '0'
else
write(f3, zv1^.el);
zv1 := zv^.sled;
if (zv1^.el in ms) or (zv1 = kz) then
c := '0'
else
write(f3, zv1^.el);
end;
zv := zv^.sled;
end;
end;
{ Главная }
var
sp: t;
f, g: text;
err: boolean;
begin
assign(f, 'dan9.inp');
assign(g, 'res9.out');
rewrite(g);
create(f, sp);
print(g, sp);
correct(g, sp, err);
prefix(g, sp, err);
close(g);
dispose(sp);
end.