Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program p10n16;
- {
- преобразовать математическое выражение в постфиксную форму
- }
- {$APPTYPE CONSOLE}
- uses
- SysUtils, Windows,
- UStack in 'UStack.pas';
- const
- leftBr = '(';
- rightBr = ')';
- operationsFirstPr = ['*', '/'];
- operationsSecondPr = ['-', '+'];
- operations = operationsFirstPr + operationsSecondPr;
- notOperands = [leftBr, rightBr] + operations;
- var
- inp, answ, operand: String;
- ch: char;
- st: TStack;
- len, ind: integer;
- procedure removeSpace(var s: string);
- var
- ind, d, len: integer;
- begin
- d:=0;
- for ind := 1 to length(s) do
- if s[ind]<>' ' then
- begin
- inc(d);
- s[d]:=s[ind]
- end;
- SetLength(s, d);
- {
- ind := 1;
- d := 0;
- s := trim(s);
- len := length(s);
- while (ind + d <= len) do
- begin
- while (s[ind + d] = ' ') do
- inc(d);
- s[ind] := s[ind + d];
- inc(ind);
- end;
- Delete(s, len - d + 1, d); }
- end;
- begin
- setConsoleOutputCP(1251);
- SetConsoleCP(1251);
- writeln('Введите исходную строку:');
- readln(inp);
- removeSpace(inp);
- answ := '';
- len := length(inp);
- ind := 1;
- while ind <= len do
- begin
- ch := inp[ind];
- if inp[ind] in notOperands then
- begin
- case ch of
- rightBr:
- begin
- while StackPeek(st) <> leftBr do
- answ := answ + StackPop(st) + ' ';
- end;
- '+', '-':
- begin
- while StackPeek(st) in operations do
- answ := answ + StackPop(st) + ' ';
- end;
- '*', '/':
- begin
- while StackPeek(st) in operationsFirstPr do
- answ := answ + StackPop(st) + ' ';
- end;
- end;
- if ch = rightBr then
- StackPop(st)
- else
- StackPush(st, ch);
- end
- else
- begin
- operand := ch;
- while (ind < len) and not(inp[ind + 1] in notOperands) do
- begin
- operand := operand + inp[ind + 1];
- inc(ind);
- end;
- answ := answ + operand + ' ';
- end;
- inc(ind);
- end;
- while not StackIsEmpty(st) do
- answ := answ + StackPop(st) + ' ';
- writeln(answ);
- readln;
- end.
- Unit UStack;
- interface
- const
- MaxN = 1000;
- type
- TValue = char;
- TStackArray = array [1 .. MaxN] of TValue;
- TStack = record
- StackArray: TStackArray;
- top: integer;
- end;
- procedure StackInit(var S: TStack);
- procedure StackPush(var S: TStack; E: TValue);
- function StackPop(var S: TStack): TValue;
- function StackIsEmpty(var S: TStack): boolean;
- function StackIsFull(var S: TStack): boolean;
- function StackPeek(var S: TStack): TValue;
- implementation
- uses SysUtils;
- procedure StackInit(var S: TStack);
- begin
- S.top := 0;
- end;
- function StackIsEmpty(var S: TStack): boolean;
- begin
- result := (S.top = 0);
- end;
- procedure StackPush(var S: TStack; E: TValue);
- begin
- with S do
- if not StackIsFull(S) then
- begin
- inc(top);
- StackArray[top] := E;
- end
- else
- raise EOverflow.Create('Stack is full');
- end;
- function StackPop(var S: TStack): TValue;
- begin
- with S do
- if top <> 0 then
- begin
- result := StackArray[top];
- dec(top);
- end
- else
- raise EUnderflow.Create('Stack is empty');
- end;
- function StackIsFull(var S: TStack): boolean;
- begin
- result := (S.top = MaxN);
- end;
- function StackPeek(var S: TStack): TValue;
- begin
- if S.top > 0 then
- result := S.StackArray[S.top];
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment