В строке символов f записана без ошибок формула, определяемая следующим образом:
- Любая арабская цифра является формулой.
- Формулами являются выражения вида:
m(формула, формула) или р(формула, формула), где m(a,b)=abs(a-b)mod 10, p(a,b)=(a+b)mod 10.
- Других формул нет.
Составить программу, вычисляющую значение формулы:
(например, m(9,p(p(5,9),m(2,6)))=m(9,p(4,4))=1)
Для решения задачи воспользуемся следующими идеями:
- Образуем множество символов mn=['0'..'9','m','p'];
- Организуем последовательную обработку символов с формулы f по правилу: если с- элемент множества mn, поместим его в стек, иначе, если с=’)‘ , возьмем из стека три последних элемента, выполним операцию (последний из этих трех элементов m или р) и ее результат поместим в стек. Символы ‘(‘ и ‘,’ игнорируются.
- После окончания обработки прочитываем ответ из стека.
program formula;
uses crt;
const mn: set of char=['0'..'9','m','p'];
type
te=char;
ss=^zveno;
zveno=record
inf:te;
sled:ss
end;
stek=ss;
var s:stek; f,fst:string[100];
c,op,x,y:char; x1,y1,k1,i,k:integer;
function pust(var st:stek):boolean;
begin
pust:=st=nil
end;
procedure vstek(var st:stek; x:te);
var g:ss;
begin
new(g);
g^.inf:=x;
g^.sled:=st;
st:=g
end;
procedure izsteka(var st:stek; var x:te);
var g:ss;
begin
if st=nil then writeln('stek pust') else
begin
g:=st;x:=g^.inf;
st:=st^.sled;
dispose(g);
end;
end;
BEGIN clrscr; writeln('input formula');
read(f); s:=nil;
for i:=1 to length(f) do
begin
if f[i] in mn then vstek(s,f[i]) else
if f[i]=')' then
begin
izsteka(s,y); izsteka(s,x); izsteka(s,op);
val(y,y1,k1); val(x,x1,k1);
case op of
'm': k:=abs(x1-y1) mod 10;
'p': k:=(x1+y1) mod 10;
end;
str(k,fst); vstek(s,fst[1]);
end;
end;
izsteka(s,c); writeln('=',c);
readkey;
END.