Advertisement
ALTracer

RPN_52_v2.pas

Dec 9th, 2020
1,050
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 1.92 KB | None | 0 0
  1. program RPN;
  2. uses Contnrs;
  3. var
  4.   s: String; //Input string
  5.   stack: TStack; //Working RPN stack
  6.   a, b, r: LongInt; //Two operands and result
  7.   op: Char;
  8.   buf: String; //Holds a single operand or operator
  9.   l, head, tail: Integer; // Input string parser pointers
  10.  
  11. procedure my_Push(var stack: TStack; r: LongInt);
  12. var pr: ^LongInt;
  13. begin
  14.   New(pr);
  15.   pr^ := r;
  16.   stack.Push(pr);
  17. end;
  18.  
  19. function my_Pop(var stack: TStack) : LongInt;
  20. var pv: ^LongInt;
  21. begin
  22.   pv := stack.Pop();
  23.   if pv = nil
  24.      then WriteLn('Stack is already empty!');
  25.   my_Pop := pv^;
  26.   Dispose(pv);
  27. end;
  28.  
  29. begin
  30. //  WriteLn('Enter an expression in RPN notation: ');
  31.   ReadLn(s);
  32.   s := s + ' ';
  33.   stack := TStack.Create;
  34.  
  35.   repeat
  36.     head := 1;
  37.     tail := Pos(' ', s);
  38.     if tail = head then begin
  39.       Delete(s, head, tail-head+1);
  40.       l := Length(s);
  41.       continue; // skip leading spaces
  42.     end;
  43.     buf := Copy(s, head, tail-head);
  44.  
  45.     op := buf[1];
  46.     case op of // Pascal case does not fall through!
  47.       '+':
  48.       begin
  49.         b := my_Pop(stack);
  50.         a := my_Pop(stack);
  51.         r := a + b;
  52.         my_Push(stack, r);
  53.       end;
  54.       '-':
  55.       begin
  56.         b := my_Pop(stack);
  57.         a := my_Pop(stack);
  58.         r := a - b;
  59.         my_Push(stack, r);
  60.       end;
  61.       '*':
  62.       begin
  63.         b := my_Pop(stack);
  64.         a := my_Pop(stack);
  65.         r := a * b;
  66.         my_Push(stack, r);
  67.       end;
  68.       '/':
  69.       begin
  70.         b := my_Pop(stack);
  71.         if b = 0
  72.            then WriteLn('Attempting division by zero!');
  73.         a := my_Pop(stack);
  74.         r := a div b;
  75.         my_Push(stack, r);
  76.       end;
  77.       '0'..'9':
  78.       begin
  79.         Val(buf,r);
  80.         my_Push(stack, r);
  81.       end;
  82.     end; //case
  83.     Delete(s, head, tail-head+1); // delete the space as well
  84.     l := Length(s);
  85.   until (l=0);
  86.  
  87.   r := my_Pop(stack);
  88.   WriteLn(r);
  89.   stack.Destroy;
  90. //  ReadLn;
  91. end.
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement