Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Lab21;
- {$APPTYPE CONSOLE}
- {$R *.res}
- uses
- System.SysUtils;
- Type
- PStack = ^Element;
- Element = Record
- Data: Char;
- Next: PStack;
- End;
- Function Pop(Var Stack: PStack): Char;
- Var
- El: Char;
- Top: PStack;
- Begin
- Top := Stack;
- El := Stack.Data;
- Top := Stack.Next;
- Stack := Top;
- Pop := El;
- End;
- Procedure Push(Var Stack: PStack;El: Char);
- Var
- Top: PStack;
- Begin
- New(Top);
- Top.Data := El;
- Top.Next := Stack;
- Stack := Top;
- Top := Nil;
- End;
- Function CheckLine(Line: String): Boolean;
- Const
- AllowedSymbols = ['+','-','*','/','^','(',')','A'..'Z','a'..'z','0'..'9'];
- Var
- IsCorrect: Boolean;
- I: Integer;
- Begin
- IsCorrect := True;
- I := 1;
- While IsCorrect and (I <= Length(Line)) do
- begin
- if Not (Line[I] in AllowedSymbols) then
- IsCorrect := False;
- Inc(I);
- end;
- CheckLine := IsCorrect;
- End;
- Function TakeLine(): String;
- Var
- IsCorrect: Boolean;
- Line: String;
- Begin
- repeat
- IsCorrect := True;
- ReadLn(Line);
- if (Length(Line) < 1) or (Length(Line) > 1024) then
- begin
- WriteLn('Недопустимая длина строки!');
- IsCorrect := False;
- end;
- if IsCorrect and Not CheckLine(Line) then
- begin
- WriteLn('Строка содержит недопустимые символы!');
- IsCorrect := false;
- end;
- until IsCorrect;
- TakeLine := Line;
- End;
- Function MakePostfix(Infix: String): String;
- Const
- Symbols = ['A'..'Z','a'..'z','0'..'9'];
- Plus = ['+','-'];
- Mult = ['*','/'];
- Var
- I: Integer;
- Stack: PStack;
- Postfix: String;
- IsOpen: Boolean;
- Begin
- Postfix := '';
- New(Stack);
- Stack.Data := '$';
- Stack.Next := Nil;
- IsOpen := False;
- For I := 1 to High(Infix) do
- begin
- if Infix[I] in Symbols then
- Postfix := Postfix + Infix[I]
- else if (Infix[I] in Plus) and Not(Stack.Data in Mult) and Not(Stack.Data in Plus) and (Stack.Data <> '^') then
- Push(Stack, Infix[I])
- else if (Infix[I] in Plus) and (Stack.Data in Plus) then
- begin
- Postfix := Postfix + Pop(Stack);
- Push(Stack, Infix[I]);
- end
- else if (Infix[I] in Plus) and ((Stack.Data in Mult) or (Stack.Data = '^')) then
- begin
- while (Stack.Data <> '$') and (Stack.Data <> '(') do
- Postfix := Postfix + Pop(Stack);
- Push(Stack, Infix[I]);
- end
- else if (Infix[I] in Mult) and Not (Stack.Data in Mult) and (Stack.Data <> '^') then
- Push(Stack, Infix[I])
- else if (Infix[I] in Mult) and (Stack.Data in Mult) then
- begin
- Postfix := Postfix + Pop(Stack);
- Push(Stack, Infix[I]);
- end
- else if (Infix[I] in Mult) and (Stack.Data = '^') then
- begin
- while (Stack.Data <> '$') and (Stack.Data <> '(') do
- Postfix := Postfix + Pop(Stack);
- Push(Stack, Infix[I]);
- end
- else if Infix[I] = '^' then
- Push(Stack, Infix[I])
- else if Infix[I] = '(' then
- Push(Stack, Infix[I])
- else if Infix[I] = ')' then
- begin
- while (Stack.Data <> '(') and (Stack.Data <> '$') do
- Postfix := Postfix + Pop(Stack);
- Pop(Stack);
- end;
- end;
- while Stack.Data <> '$' do
- begin
- Postfix := Postfix + Pop(Stack);
- end;
- MakePostfix := Postfix;
- End;
- Procedure ShowRank(Postfix: String);
- Const
- Symbols = ['A'..'Z','a'..'z','0'..'9'];
- Var
- RankS, RankO, I: Integer;
- Begin
- RankS := 0;
- RankO := 0;
- For I := 1 to High(Postfix) do
- begin
- if Postfix[I] in Symbols then
- Inc(RankS)
- else
- Dec(RankO);
- end;
- WriteLn(RankS,' - ',Abs(RankO),' = ',RankS + RankO);
- if RankS + RankO = 1 then
- WriteLn('Выражение верное!')
- else
- WriteLn('Выражение неверное!');
- End;
- Procedure Main();
- Var
- Infix, Postfix: String;
- Begin
- WriteLn('Введите выражение в инфиксной записи.');
- Infix := TakeLine();
- Postfix := MakePostfix(Infix);
- WriteLn(Postfix);
- ShowRank(Postfix);
- End;
- Begin
- Main();
- WriteLn('Нажмите Enter, чтобы продолжить.');
- ReadLn;
- End.
- //Преобразовать выражение в обратную польскую запсиь используя стек со скобками и двойными степенями и !!!!считаем ранг!!!!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement