Jovfer

task2

Oct 24th, 2012
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.54 KB | None | 0 0
  1. program p10n16;
  2. {
  3.   преобразовать математическое выражение в постфиксную форму
  4. }
  5. {$APPTYPE CONSOLE}
  6.  
  7. uses
  8.   SysUtils, Windows,
  9.   UStack in 'UStack.pas';
  10.  
  11. const
  12.   leftBr = '(';
  13.   rightBr = ')';
  14.   operationsFirstPr = ['*', '/'];
  15.   operationsSecondPr = ['-', '+'];
  16.   operations = operationsFirstPr + operationsSecondPr;
  17.   notOperands = [leftBr, rightBr] + operations;
  18.  
  19. var
  20.   inp, answ, operand: String;
  21.   ch: char;
  22.   st: TStack;
  23.   len, ind: integer;
  24.  
  25. procedure removeSpace(var s: string);
  26. var
  27.   ind, d, len: integer;
  28. begin
  29.   d:=0;
  30.   for ind := 1 to length(s) do
  31.     if s[ind]<>' ' then
  32.       begin
  33.         inc(d);
  34.         s[d]:=s[ind]
  35.       end;
  36.   SetLength(s, d);
  37. {
  38.  
  39.   ind := 1;
  40.   d := 0;
  41.   s := trim(s);
  42.   len := length(s);
  43.   while (ind + d <= len) do
  44.   begin
  45.     while (s[ind + d] = ' ') do
  46.       inc(d);
  47.     s[ind] := s[ind + d];
  48.     inc(ind);
  49.   end;
  50.   Delete(s, len - d + 1, d);   }
  51. end;
  52.  
  53. begin
  54.   setConsoleOutputCP(1251);
  55.   SetConsoleCP(1251);
  56.   writeln('Введите исходную строку:');
  57.   readln(inp);
  58.   removeSpace(inp);
  59.   answ := '';
  60.   len := length(inp);
  61.   ind := 1;
  62.   while ind <= len do
  63.   begin
  64.     ch := inp[ind];
  65.     if inp[ind] in notOperands then
  66.     begin
  67.       case ch of
  68.         rightBr:
  69.           begin
  70.             while StackPeek(st) <> leftBr do
  71.               answ := answ + StackPop(st) + ' ';
  72.           end;
  73.         '+', '-':
  74.           begin
  75.             while StackPeek(st) in operations do
  76.               answ := answ + StackPop(st) + ' ';
  77.           end;
  78.         '*', '/':
  79.           begin
  80.             while StackPeek(st) in operationsFirstPr do
  81.               answ := answ + StackPop(st) + ' ';
  82.           end;
  83.       end;
  84.       if ch = rightBr then
  85.         StackPop(st)
  86.       else
  87.         StackPush(st, ch);
  88.     end
  89.     else
  90.     begin
  91.       operand := ch;
  92.       while (ind < len) and not(inp[ind + 1] in notOperands) do
  93.       begin
  94.         operand := operand + inp[ind + 1];
  95.         inc(ind);
  96.       end;
  97.       answ := answ + operand + ' ';
  98.     end;
  99.     inc(ind);
  100.   end;
  101.  
  102.   while not StackIsEmpty(st) do
  103.     answ := answ + StackPop(st) + ' ';
  104.  
  105.   writeln(answ);
  106.   readln;
  107.  
  108. end.
  109.  
  110.  
  111.  
  112.  
  113. Unit UStack;
  114.  
  115. interface
  116.  
  117. const
  118.   MaxN = 1000;
  119.  
  120. type
  121.   TValue = char;
  122.   TStackArray = array [1 .. MaxN] of TValue;
  123.  
  124.   TStack = record
  125.     StackArray: TStackArray;
  126.     top: integer;
  127.   end;
  128.  
  129. procedure StackInit(var S: TStack);
  130. procedure StackPush(var S: TStack; E: TValue);
  131. function StackPop(var S: TStack): TValue;
  132. function StackIsEmpty(var S: TStack): boolean;
  133. function StackIsFull(var S: TStack): boolean;
  134. function StackPeek(var S: TStack): TValue;
  135.  
  136. implementation
  137.  
  138. uses SysUtils;
  139.  
  140. procedure StackInit(var S: TStack);
  141. begin
  142.   S.top := 0;
  143. end;
  144.  
  145. function StackIsEmpty(var S: TStack): boolean;
  146. begin
  147.   result := (S.top = 0);
  148. end;
  149.  
  150. procedure StackPush(var S: TStack; E: TValue);
  151. begin
  152.   with S do
  153.     if not StackIsFull(S) then
  154.     begin
  155.       inc(top);
  156.       StackArray[top] := E;
  157.     end
  158.     else
  159.       raise EOverflow.Create('Stack is full');
  160. end;
  161.  
  162. function StackPop(var S: TStack): TValue;
  163. begin
  164.   with S do
  165.     if top <> 0 then
  166.     begin
  167.       result := StackArray[top];
  168.       dec(top);
  169.     end
  170.     else
  171.       raise EUnderflow.Create('Stack is empty');
  172. end;
  173.  
  174. function StackIsFull(var S: TStack): boolean;
  175. begin
  176.   result := (S.top = MaxN);
  177. end;
  178.  
  179. function StackPeek(var S: TStack): TValue;
  180. begin
  181.   if S.top > 0 then
  182.     result := S.StackArray[S.top];
  183. end;
  184.  
  185. end.
Advertisement
Add Comment
Please, Sign In to add comment