POLSK.PAS 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const
  2. deyst = ['+','*','/','-'];
  3. type
  4. ps = ^el;
  5. el = record
  6. data : integer;
  7. prev : ps;
  8. end;
  9. var
  10. header : ps;
  11. polsk : string;
  12. this : string;
  13. pos1 : byte;
  14. num1,
  15. num2 : integer;
  16. Procedure MakeD(var num1:integer;num2:integer;deyst:char);
  17. begin
  18. case deyst of
  19. '+': num1 := num1 + num2;
  20. '-': num1 := num1 - num2;
  21. '*': num1 := num1 * num2;
  22. '/': if num2 <> 0 then num1 := num1 div num2;
  23. end;
  24. end;
  25. Function GetNext(a:string;var pos:byte):string;
  26. var ret : string;
  27. begin
  28. ret := a[pos];
  29. inc(pos);
  30. while (a[pos] <> ',') and (pos1<>length(a)+1) do begin ret := ret + a[pos];inc(pos);end;
  31. inc(pos);
  32. GetNext := ret;
  33. end;
  34. Procedure PUSH(i:integer;var head:ps);
  35. var ne : ps;
  36. begin
  37. New(ne);
  38. ne^.data := i;
  39. ne^.prev := head;
  40. head := ne;
  41. end;
  42. Function POP(var head:ps):integer;
  43. var ret:integer;newhead:ps;
  44. begin
  45. ret := head^.data;
  46. newhead := head^.prev;
  47. Dispose(head);
  48. head := newhead;
  49. POP := ret;
  50. end;
  51. begin
  52. polsk := '8,3,*,5,+,9,+,';
  53. header^.prev := nil;
  54. pos1:=1;
  55. While pos1 <> length(polsk)+1 do
  56. begin
  57. this := getNext(polsk,pos1);
  58. if this[length(this)] in deyst then
  59. begin
  60. num1 := POP(header);
  61. num2 := POP(header);
  62. makeD(num1,num2,this[1]);
  63. PUSH(num1,header);
  64. end
  65. else
  66. begin
  67. val(this,num1,num2);
  68. PUSH(num1,header);
  69. end;
  70. end;
  71. WriteLN(POP(header));
  72. end.