| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- const
- deyst = ['+','*','/','-','(',')'];
- Copers : array [1..6] of char = ('+','-','*','/','(',')');
- type
- ps = ^el;
- el = record
- data : integer;
- prev : ps;
- end;
- var
- header : ps;
- polsk : string;
- Procedure MakeD(var num1:integer;num2:integer;dey:char);
- begin
- case dey of
- '+': num1 := num1 + num2;
- '-': num1 := num1 - num2;
- '*': num1 := num1 * num2;
- '/': if num2 <> 0 then num1 := num1 div num2;
- end;
- end;
- Function GetOper(dey:char):integer;
- begin
- case dey of
- '+': GetOper:=1;
- '-': GetOper:=2;
- '*': GetOper:=3;
- '/': GetOper:=4;
- '(': GetOper:=5;
- ')': GetOper:=6;
- end;
- end;
- Function GetPrior(dey : integer):integer;
- begin
- case dey of
- 1..2: GetPrior:=1;
- 3..4: GetPrior:=2;
- 5 : GetPrior:=0;
- 6 : GetPrior:=3;
- end;
- end;
- Function GetNext(a:string;var pos:byte;done:boolean):string;
- var ret : string;
- begin
- ret := a[pos];
- inc(pos);
- if not(a[pos-1] in deyst) then
- begin
- if done then while (a[pos] <> ',') and (pos<>length(a)+1) do
- begin
- ret := ret + a[pos];
- inc(pos);
- end
- else
- while (not(a[pos] in deyst)) and (pos<>length(a)+1) do
- begin
- ret := ret + a[pos];
- inc(pos);
- end;
- end;
- if done then inc(pos);
- GetNext := ret;
- end;
- Procedure PUSH(i:integer;var head:ps);
- var ne : ps;
- begin
- New(ne);
- ne^.data := i;
- ne^.prev := head;
- head := ne;
- end;
- Function POP(var head:ps):integer;
- var ret:integer;newhead:ps;
- begin
- ret := head^.data;
- newhead := head^.prev;
- Dispose(head);
- head := newhead;
- POP := ret;
- end;
- Function MakePol(inp:string):string;
- Var
- datas : ps;
- opers : ps;
- pos : byte;
- cur : string;
- outp : string;
- curout : string;
- num,
- code,
- oper : integer;
- Procedure PopAll;
- begin
- While (datas^.prev <>nil) and (datas^.prev^.prev <> nil) and (opers^.prev <> nil) do
- begin
- str(POP(datas),curout);
- outp := outp + curout + ',';
- str(POP(datas),curout);
- outp := outp + curout + ',';
- outp := outp+Copers[POP(opers)]+',';
- if outp[length(outp)-2] in ['(',')'] then delete(outp,length(outp)-2,2);
- end;
- While datas^.prev <> nil do
- begin
- str(POP(datas),curout);
- outp := outp + curout + ',';
- end;
- While opers^.prev <> nil do
- begin
- outp := outp+Copers[POP(opers)]+',';
- if outp[length(outp)-1] in ['(',')'] then delete(outp,length(outp)-1,2);
- end;
- end;
- Begin
- New(Datas);
- New(opers);
- OutP := '';
- datas^.prev := nil;
- opers^.prev := nil;
- opers^.data := 0;
- pos := 1;
- while pos <> length(inp)+1 do
- begin
- cur := GetNext(inp,pos,false);
- if cur[length(cur)] in deyst then
- begin
- oper := GetOper(cur[1]);
- if opers^.prev <> nil then
- begin
- if oper = 6 then PopAll else begin
- while (GetPrior(opers^.data) >= GetPrior(oper)) and (datas^.prev<>nil) do
- begin
- str(POP(datas),curout);
- outp := outp + curout + ',';
- if length(outp) = length(curout)+1 then
- begin
- str(POP(datas),curout);
- outp := outp + curout + ',';
- end;
- outp := outp+Copers[POP(opers)]+',';
- if outp[length(outp)-1] in ['(',')'] then
- delete(outp,length(outp)-1,2);
- end;
- PUSH(oper,opers)
- end;
- end
- else
- PUSH(oper,opers);
- end
- else
- begin
- val(cur,num,code);
- PUSH(num,datas);
- end;
- end;
- PopAll;
- MakePol := outp;
- end;{MakePol}
- {-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-}
- Procedure Calculate(polsk:string;var header : ps);
- Var
- this : string;
- pos1 : byte;
- num1,
- num2 : integer;
- begin
- pos1:=1;
- While pos1 <> length(polsk)+1 do
- begin
- this := getNext(polsk,pos1,true);
- if this[length(this)] in deyst then
- begin
- num1 := POP(header);
- num2 := POP(header);
- makeD(num1,num2,this[1]);
- PUSH(num1,header);
- end
- else
- begin
- val(this,num1,num2);
- PUSH(num1,header);
- end;
- end;
- end;
- {--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--}
- Var
- FIN : text;
- FOUT : text;
- inpstr: string;
- begin
- Assign(FIN,'input.txt');
- Reset(FIN);
- ReadLn(FIN,InpStr);
- Close(FIN);
- Polsk := MakePol(InpStr);
- { polsk := '8,3,*,5,+,9,+,';}
- header^.prev := nil;
- Calculate(polsk,header);
- Assign(FOUT,'output.txt');
- Rewrite(Fout);
- WriteLN(FOUT,POP(header));
- Close(Fout);
- end.
|