Advertisement
anticlown

Stack(2 sem.)

Apr 9th, 2023 (edited)
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.68 KB | None | 0 0
  1. Program AiSD_Stack;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R *.res}
  5.  
  6. Uses
  7.     System.SysUtils,
  8.     StrUtils;
  9.  
  10. Type
  11.     PElem = ^Elem;
  12.  
  13.     Elem = Record
  14.         Data: Char;
  15.         Next: PElem;
  16.     End;
  17.  
  18.     IntList = Record
  19.         FirstElem: PElem;
  20.         Length: Integer;
  21.         Rang: Integer;
  22.     End;
  23.  
  24. Function IsExpressionNotEmpty(Expression: String): Boolean; StdCall; External 'libInput.dll';
  25.  
  26. Function IsExpressionBracketBalanced(Expression: String): Boolean; StdCall; External 'libInput.dll';
  27.  
  28. Function IsExpressionNotContainsIllegalCharacters(Expression: String): Boolean; StdCall; External 'libInput.dll';
  29.  
  30. Function InputExpression: String; StdCall; External 'libInput.dll';
  31.  
  32. Function IsEmptyStack(Stack: IntList): Boolean; //проверка
  33. Begin
  34.     Result := Stack.FirstElem = Nil;
  35. End;
  36.  
  37. Function Pop(Var Stack: IntList): Char; // вынимание из стека
  38. Begin
  39.     If IsEmptyStack(Stack) Then
  40.         Result := #0
  41.     Else
  42.     Begin
  43.         Result := Stack.FirstElem^.Data;
  44.         Dec(Stack.Length);
  45.         Stack.FirstElem := Stack.FirstElem^.Next;
  46.     End;
  47. End;
  48.  
  49. Function Peek(Stack: IntList): Char; //  вынимание без удаления
  50. Begin
  51.     If IsEmptyStack(Stack) Then
  52.         Result := #0
  53.     Else
  54.         Result := Stack.FirstElem^.Data;
  55. End;
  56.  
  57. Procedure Push(Var Stack: IntList; Data: Char);  // занос в стек
  58. Var
  59.     NewElem: PElem;
  60. Begin
  61.     New(NewElem);
  62.     NewElem^.Next := Stack.FirstElem;
  63.     Stack.FirstElem := NewElem;
  64.     Stack.FirstElem^.Data := Data;
  65.     Inc(Stack.Length);
  66. End;
  67.  
  68. Function GetStackPriority(Character: Char): Integer;  //стековый приоритет
  69. Begin
  70.     Case Character Of
  71.         '+', '-':
  72.             Result := 2;
  73.         '/', '*':
  74.             Result := 4;
  75.         '(':
  76.             Result := 0;
  77.         'a' .. 'z':
  78.             Result := 8;
  79.         '^':
  80.             Result := 5;
  81.     End;
  82. End;
  83.  
  84. Function GetPriority(Character: Char): Integer;  //относительный приоритет
  85. Begin
  86.     Case Character Of
  87.         '+', '-':
  88.             Result := 1;
  89.         '/', '*':
  90.             Result := 3;
  91.         '(':
  92.             Result := 9;
  93.         'a' .. 'z':
  94.             Result := 7;
  95.         '^':
  96.             Result := 6;
  97.     End;
  98. End;
  99.  
  100. Procedure СalculationOfRang(Var Stack: IntList); //счет ранга выражения
  101. Begin
  102.     If Peek(Stack) In ['a' .. 'z'] Then
  103.         Inc(Stack.Rang)
  104.     Else
  105.         Dec(Stack.Rang);
  106. End;
  107.  
  108. Function Reverse(Expression: String): String;  //суффиксное переворачиваем в префиксное
  109. Var
  110.     Output: String;
  111.     I: Integer;
  112. Begin
  113.     Output := AnsiReverseString(Expression);
  114.     For I := 1 To Length(Output) Do
  115.         If Output[I] = '(' Then
  116.             Output[I] := ')'
  117.         Else If Output[I] = ')' Then
  118.             Output[I] := '(';
  119.     Result := Output;
  120. End;
  121.  
  122. Function ConvertToSuffix(Var Stack: IntList; Expression: String): String; //перевод в суффиксное
  123. Var
  124.     FinalAnswer: String;
  125.     I: Integer;
  126. Begin
  127.     Stack.Rang := 0;
  128.     Push(Stack, Expression[1]);
  129.     FinalAnswer := '';
  130.     For I := 2 To Length(Expression) Do
  131.     Begin
  132.         If Expression[I] = ')' Then
  133.         Begin
  134.             While Peek(Stack) <> '(' Do
  135.             Begin
  136.                 СalculationOfRang(Stack);
  137.                 FinalAnswer := Concat(FinalAnswer, Pop(Stack));
  138.             End;
  139.             Pop(Stack);
  140.         End
  141.         Else
  142.         Begin
  143.             If GetPriority(Expression[I]) > GetStackPriority(Peek(Stack)) Then
  144.                 Push(Stack, Expression[I])
  145.             Else
  146.             Begin
  147.                 While Not(IsEmptyStack(Stack)) And
  148.                     (GetPriority(Expression[I]) <= GetStackPriority(Peek(Stack))) Do
  149.                 Begin
  150.                     СalculationOfRang(Stack);
  151.                     FinalAnswer := Concat(FinalAnswer, Pop(Stack));
  152.                 End;
  153.                 Push(Stack, Expression[I]);
  154.             End;
  155.         End;
  156.     End;
  157.     While Stack.FirstElem <> Nil Do
  158.     Begin
  159.         СalculationOfRang(Stack);
  160.         FinalAnswer := Concat(FinalAnswer, Pop(Stack));
  161.     End;
  162.     Result := FinalAnswer;
  163. End;
  164.  
  165. //Main
  166. Var
  167.     Stack: IntList;
  168.     Expression: String;
  169. Begin
  170.     Expression := InputExpression;
  171.     Writeln('Суффиксное выражение равно = ', ConvertToSuffix(Stack, Expression));
  172.     Writeln('Ранг равен = ', Stack.Rang);
  173.     Writeln(Reverse(Expression));
  174.     Writeln('Префиксное выражение равно = ',
  175.         Reverse(ConvertToSuffix(Stack, Reverse(Expression))));
  176.     Writeln('Ранг равен = ', Stack.Rang);
  177.     Readln;
  178.  
  179. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement