Модератор: Модераторы
program lab8;
uses
    crt;
const
     n = 20;
type
    pos = 0..n;
var
   st,res : string;
   critical : array[0..n div 2] of pos;
   temp : array[0..n div 2 +1] of string;
   sign : array[1..n] of char;
   priority : array[0..n] of pos;
   SignPos : array[1..n] of integer;
   i,j,k,m,x,l,o : integer;
   f : boolean;
   pr,min,top : pos;
begin
clrscr;
writeln('enter the expression in the infix form :');
read(st);
j := 1;
 for i := 1 to length(st) do
 begin
 f := true;
 case st[i] of
  '+' : sign[j] := '+';
  '-' : sign[j] := '-';
  '*' : sign[j] := '*';
  '/' : sign[j] := '/';
 else
   begin
   dec(j);
   f := false;
   end;
 end;
 if f = true then SignPos[j] := i;
 inc(j);
 end;
 dec(j);
 pr := 3;
 priority[0] := pr;              {priority[0] - max element in mass priority}
 for i := j downto 1 do
 begin
  if st[signpos[i] + 2] = ')' then inc(pr,2);
  priority[i] := pr;
  if st[signpos[i] - 2] = '(' then dec(pr,2);
 if (sign[i] = '*') or (sign[i] = '/') then inc(priority[i]);
 if priority[i] > priority[0] then priority[0] := priority[i];
 if pr > priority[0] then priority[0] := pr;
 end;
 m := priority[0];
 writeln;
 priority[0] := 0;
 k := 0;
 critical[0] := 0;
  for i := 1 to j do
  begin
    if (priority[i-1] > priority[i]) and (priority[i+1] > priority[i]) then
    begin
    inc(k);
    critical[k] := i;     {finding critical points}
    inc(critical[0]);   {nubmer of critical points}
    end;
  end;
  critical[k+1] := j+1;
  k := 1;
  x:=1;
{} for i := 1 to critical[0]+1 do
{} begin
    for m := k to critical[i]-1 do
    begin
     if (priority[m] > priority[m+1]) and (priority[m] > priority[m-1]) then
     begin
     top := m;
     temp[x] := sign[m] + st[signpos[m]-1] + st[signpos[m]+1];
     pr := priority[m];
     if priority[k] <  priority[critical[i]-1] then min := priority[k]
      else min := priority[critical[i]-1];
     end;
    end;
    for l := pr - 1 downto min do
    begin
     for m := k to critical[i]-1 do
     begin
      if priority[m] = l then
      begin
       if m < top then
       begin
       o := signpos[m] - 1;
       temp[x] := sign[m] + st[o] + temp[x];
       end;
       if m > top then
       begin
       o :=  signpos[m] + 1;
       temp[x] := sign[m] + temp[x] + st[o];
       end;
      end;
     end;
    end;
   k := critical[i]+1;
   inc(x);
 end;
 m := 0;
 min := n;
  for i := 1 to critical[0] do
  begin
  if priority[critical[i]] > m then m := priority[critical[i]];
  if priority[critical[i]] < min then min := priority[critical[i]];
  end;
  for i := m downto min do
  begin
   for k := 1 to critical[0] do
   begin
    if priority[critical[k]] = i then
    begin
    temp[k] := sign[critical[k]] + temp[k] + temp[k+1];
    temp[k+1] := temp[k];
    l := k+1;
     while priority[critical[l]] > priority[critical[k]] do
     begin
     temp[l+1] := temp[k];
     inc(l);
     end;
    l := k-1;
     while priority[critical[l]] >= priority[critical[k]] do
     begin
     temp[l] := temp[k];
     dec(l);
     end;
    end;
   end;
  end;
 res := temp[1];
 if top = 0 then
 begin
 for i := 1 to j do res := sign[i] + res;
 for i := 0 to j do res := res + st[2*i +1];
 end;
 writeln(res);
 readkey;
 end.
Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1