Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program Project2;
- {$APPTYPE CONSOLE}
- uses
- SysUtils, Windows;
- type
- StackElPT = ^TStack;
- TStack = record
- Elem: Char;
- Next: StackElPT;
- end;
- //Добавление к стеку st элемента value
- procedure Push(var st: StackElPT; value: Char);
- var
- x: StackElPT;
- begin
- New(x); //Добавляемый элемент
- x^.Elem := value;
- x^.next := st; //Стек строим так, что next ссылатся на то, что положили ранше
- st := x;
- end;
- //Забрать из стека верхний элемент
- function Pop(var st: StackElPT): Char;
- begin
- if st <> nil then
- begin
- Pop := st^.Elem;
- st := st^.next; //Убираем элемент из стека
- end
- else
- Pop := #0; //Для пустого стека возвращаем символ #0
- end;
- //Получить стековый пиоритет символа с
- function StackPriority(c: Char): Integer;
- begin
- case c of
- '+', '-':
- Result := 2;
- '*', '/':
- Result := 4;
- '^':
- Result := 5;
- 'a'..'z', 'A'..'Z':
- Result := 8;
- '(':
- Result := 0;
- else
- Result := 10; //Для неизвестного символа возвращаем 10
- end;
- end;
- //Получить отнсительный пиоритет символа с
- function InpPriority(c: Char): Integer;
- begin
- case c of
- '+', '-' :
- Result := 1;
- '*', '/' :
- Result := 3;
- '^' :
- Result := 6;
- 'a'..'z', 'A'..'Z':
- Result := 7;
- '(':
- Result := 9;
- ')':
- Result := 0;
- else
- Result := 10; //Для неизвестного символа возвращаем 10
- end;
- end;
- //Возвращает ранг символа в польской записи
- function CharRang(c: Char): Integer;
- begin
- if c in ['a'..'z', 'A'..'Z'] then
- Result := 1 //Для операнда ранг 1
- else
- Result := -1; //Для оператора -1
- end;
- var
- st: StackElPT;
- input, output: string;
- rang, i: Integer;
- t: Char;
- begin
- st := nil; //Сделали стек пустым
- rang := 0; //Обнуляем ранг
- output := ''; //И входную строку
- WriteLn('Введите выражение: ');
- Readln(input);
- i := 1;
- while i <= Length(input) do //i Может измениться не после каждой итерации (Не for)
- //Стек пуст или верхний элемнт стека имеет менщий приоритет
- if (st = nil) or (InpPriority(Input[i]) > StackPriority(st^.Elem)) then
- begin
- if Input[i] <> ')' then // ( в стек ложить не надо
- Push(st,input[i]); //Ложим входной символ в стек
- Inc(i); //След. символ
- end
- //Стек не пуст и приоритет входного символа меньше
- else
- begin
- t := Pop(st);
- if Input[i] = ')' then
- while t <> '(' do
- t := Pop(st)
- //Забираем из стека верний символ
- else if t <> '(' then //( Добавлять в езултат не надо
- begin
- output := output + t; //Дописываем к выходной строке
- rang := rang + CharRang(t); //Изменяем ранг выражения
- end;
- //К след символу входной строи не переходим
- end;
- //Дописываем всё что осталось в стеке
- while not (st = nil) do
- begin
- t := Pop(st); //Забираем из стека верний символ
- if t <> '(' then
- begin //( Добавлять в резултат не надо
- output := output + t; //Дописываем к выходной строке
- rang := rang + CharRang(t);
- end;
- end;
- WriteLn('Постфиксная форма: ');
- Writeln(output);
- Write('Ранг выражения: ');
- Writeln(rang);
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement