Страница 1 из 1
		
			
				нужна помощь. перевод из инфиксной формы в префиксную
				
Добавлено: 
19.12.2009 20:11:44 glupo
				помогите пожалуйста идеей или накрайняк кодом. надо написать программу перевода выражения из инфиксной формы в префиксную без исполльзования деревьев, рекурсии и указателей. буду очень благодарен.
			 
			
		
			
				Re: нужна помощь. перевод из инфиксной формы в префиксну
				
Добавлено: 
20.12.2009 14:29:59 alexrayne
				без использования всего етого, или как минимум рекурсии неполучица. мое имхо. как минимум рекурсию можно будет замменить на итерацию+стек параметров, но ето будет просто эквивалентная замена рекурсии.
			 
			
		
			
				Re: нужна помощь. перевод из инфиксной формы в префиксну
				
Добавлено: 
21.12.2009 01:37:02 glupo
				уфф, решение нашел.в силу того, что я только начинающий в программировании, хотелось бы выслушать конструктивную критику по поводу кода:
- Код: Выделить всё
- 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.
 
 
 
 
 
			
		
			
				Re: нужна помощь. перевод из инфиксной формы в префиксну
				
Добавлено: 
21.12.2009 02:34:41 alexrayne
				еслиб Вы необъяснили что ето за задача, то по коду понять невозможно. 
гиасилил я код, в обзих чертах себе представляю что ето, но как баги ловить?
потому и делают все нормальные люди рекурсию.