Advertisement
Ewerlost

Poland

Apr 19th, 2024
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.53 KB | None | 0 0
  1. program PolNotation;
  2.  
  3. uses
  4.   System.SysUtils;
  5.  
  6. Type
  7.     TPStack = ^TStackElem;
  8.     TStackElem = Record
  9.         StackPriority: Integer;
  10.         Symbol: Char;
  11.         Next: TPStack;
  12.     End;
  13.  
  14. Function InputStrExpr(): String;
  15. Const
  16.     CorrectSymbolsVar = ['a'..'z'];
  17.     CorrectSymbolsOper = ['*', '/', '-', '+', '^'];
  18. Var
  19.     StrExpr: String;
  20.     OpeningBracketCounter, ClosingBracketCounter, OperatorCount, VariableCount, I: Integer;
  21.     IsCorrect: Boolean;
  22. Begin
  23.     Repeat
  24.         Writeln('Введите выражение, состоящее из однобуквенных переменных (от a до z), знаков арифметических операций и круглых скобок. Выражение должно соответствовать правилам математики.');
  25.         Readln(StrExpr);
  26.         VariableCount := 0;
  27.         OperatorCount := 0;
  28.         OpeningBracketCounter := 0;
  29.         ClosingBracketCounter := 0;
  30.         IsCorrect := True;
  31.         For I := 1 to Length(StrExpr) do
  32.         Begin
  33.             if IsCorrect And (StrExpr[I] In CorrectSymbolsVar) then
  34.                 Inc(VariableCount)
  35.             Else
  36.                 if IsCorrect And (StrExpr[I] In CorrectSymbolsOper) then
  37.                     Inc(OperatorCount)
  38.                 Else
  39.                     if IsCorrect And (StrExpr[I] = '(') then
  40.                         Inc(OpeningBracketCounter)
  41.                     Else
  42.                         if IsCorrect And (StrExpr[I] = ')') then
  43.                             Inc(ClosingBracketCounter)
  44.                         Else
  45.                         Begin
  46.                             Writeln('В выражении присутствуют недопустимые символы.');
  47.                             IsCorrect := False;
  48.                             break;
  49.                         End;
  50.         End;
  51.         if OpeningBracketCounter<>ClosingBracketCounter then
  52.         Begin
  53.             Iscorrect := False;
  54.             Writeln('В записи выражения количество открывающих и закрывающих скобок не равны.');
  55.         End;
  56.     Until(IsCorrect);
  57.     InputStrExpr := StrExpr;
  58. End;
  59.  
  60. Procedure CheckPriority(Var StackTop: TPStack; RelativePriority: Integer; Symbol: Char; Var OutputString: String);
  61. Var
  62.     NewStackTop: TPStack;
  63. Begin
  64.     while (StackTop^.Next <> Nil) And (((Symbol <> ')') And (StackTop^.StackPriority >= RelativePriority)) Or ((Symbol = ')') And (StackTop^.Symbol <>'('))) do
  65.     Begin
  66.         if StackTop^.Symbol <> '(' then
  67.             OutputString := OutputString + StackTop^.Symbol;
  68.         NewStackTop := StackTop^.Next;
  69.         Dispose(StackTop);
  70.         StackTop := NewStackTop;
  71.     End;
  72.     if Symbol <> ')' then
  73.     Begin
  74.         New(NewStackTop);
  75.         NewStackTop^.Symbol := Symbol;
  76.         if Symbol = '^' then
  77.             NewStackTop^.StackPriority := 5
  78.         Else
  79.             if Symbol = '(' then
  80.                 NewStackTop^.StackPriority := 0
  81.             Else
  82.                 NewStackTop^.StackPriority := RelativePriority+1;
  83.         NewStackTop^.Next := StackTop;
  84.         StackTop := NewStackTop;
  85.     End
  86.     Else
  87.         if StackTop^.Symbol = '(' then
  88.         Begin
  89.             NewStackTop := StackTop^.Next;
  90.             Dispose(StackTop);
  91.             StackTop := NewStackTop;
  92.         End;
  93.  
  94. End;
  95.  
  96. Procedure OutputInfo(Symbol : Char; StackTop : TPStack; OutputString : String);
  97. Var
  98.     StackString : String;
  99. Begin
  100.     StackString := '';
  101.     Write(Symbol + '            ');
  102.     while StackTop <> Nil do
  103.     Begin
  104.         StackString := StackTop^.Symbol + StackString;
  105.         StackTop := StackTop^.Next;
  106.     End;
  107.     Write(StackString);
  108.     Write('                            ');
  109.     Writeln(OutputString);
  110.  
  111.  
  112. End;
  113.  
  114. Function ConvertRevPolNot(Const StrExpr: String; Var StackTop: TPStack): String;
  115. Var
  116.     I: Integer;
  117.     OutputString: String;
  118. Begin
  119.     OutputString := '';
  120.     for I := 1 to Length(StrExpr) do
  121.     Begin
  122.         case StrExpr[I] of
  123.             '+', '-': CheckPriority(StackTop, 1, StrExpr[I], OutputString);
  124.             '*', '/': CheckPriority(StackTop, 3, StrExpr[I], OutputString);
  125.             '^': CheckPriority(StackTop, 6, StrExpr[I], OutputString);
  126.             'a'..'z': CheckPriority(StackTop, 7, StrExpr[I], OutputString);
  127.             '(': CheckPriority(StackTop, 9, StrExpr[I], OutputString);
  128.             ')': CheckPriority(StackTop, 0, StrExpr[I], OutputString);
  129.         end;
  130.         OutputInfo(StrExpr[I], StackTop, OutputString);
  131.     End;
  132.     CheckPriority(StackTop, 0, ')', OutputString);
  133.     ConvertRevPolNot := OutputString;
  134. End;
  135.  
  136. Function CalculateRank(Expression : String) : Integer;
  137. Const
  138.     SymbolsSet = ['a'..'z'];
  139.     SignSet = ['*', '/', '-', '+', '^'];
  140. Var
  141.     I, Rank : Integer;
  142. Begin
  143.     Rank := 0;
  144.     for I := 1 to Length(Expression) do
  145.         if Expression[I] in SymbolsSet then
  146.             Inc(Rank)
  147.         Else
  148.             Dec(Rank);
  149.     Result := Rank;
  150. End;
  151.  
  152. Var
  153.     StrExpr, RevPolNot: String;
  154.     StackTop: TPStack;
  155. begin
  156.     StrExpr := InputStrExpr();
  157.     New(StackTop);
  158.     Writeln('Символ' + '          ' + 'Стек' + '                   '+'Выходная строка');
  159.     RevPolNot := ConvertRevPolNot(StrExpr, StackTop);
  160.     Writeln('Выражение, записанное по обратной польской нотации:');
  161.     Writeln (RevPolNot);
  162.     CalculateRank(RevPolNot);
  163.     Write('Ранг : ');
  164.     Writeln(CalculateRank(RevPolNot));
  165.     Readln
  166. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement