题意:将一个表达式化简,将多余的括号去掉.
分析:先将表达式转为后缀表达式,再转回中缀表达式,这样多余的括号就去掉了.
code:
var snum:set of char; n,q:longint; s:ansistring; function grade(ch:char):longint; begin grade:=-1; case ch of '+':exit(1); '-':exit(1); '*':exit(2); '/':exit(2); '(':exit(0); end; end; function midfix_to_suffix(s:ansistring):ansistring; var st:array[0..300] of char; top,i:longint; ans:ansistring; c:char; begin for i:=0 to 300 do st[i]:=' '; ans:=''; top:=0; for i:=1 to length(s) do begin c:=s[i]; if c in snum then begin ans:=ans+c; continue; end; if c='(' then begin inc(top); st[top]:=c; continue; end; if c=')' then begin while (st[top]<>'(') do begin ans:=ans+st[top]; dec(top); end; dec(top); continue; end; if grade(c)>grade(st[top]) then begin inc(top); st[top]:=c; continue; end; while (grade(c)<=grade(st[top])) do begin ans:=ans+st[top]; dec(top); end; inc(top); st[top]:=c; end; while top>0 do begin ans:=ans+st[top]; dec(top); end; exit(ans); end; function suffix_to_midfix(s:ansistring):ansistring; var st:array[0..300] of ansistring; r:array[0..300] of byte; top,j:longint; c:char; s1,s2:ansistring; begin for j:=0 to 300 do begin st[j]:=' '; r[j]:=0; end; top:=0; for j:=1 to length(s) do begin c:=s[j]; if c in snum then begin inc(top); st[top]:=c; r[top]:=0; continue; end; if c='-' then begin s1:=st[top]; dec(top); s2:=st[top]; if r[top+1]=1 then st[top]:=s2+'-'+'('+s1+')' else st[top]:=s2+'-'+s1; r[top]:=1; end; if c='+' then begin s1:=st[top]; dec(top); s2:=st[top]; st[top]:=s2+'+'+s1; r[top]:=1; end; if c='*' then begin s1:=st[top]; dec(top); s2:=st[top]; if (r[top+1]<2)and(r[top+1]<>0) then s1:='('+s1+')'; if (r[top]<2)and(r[top]<>0) then s2:='('+s2+')'; st[top]:=s2+'*'+s1; r[top]:=2; end; if c='/' then begin s1:=st[top]; dec(top); s2:=st[top]; if (r[top+1]<=2)and(r[top+1]<>0) then s1:='('+s1+')'; if (r[top]<2)and(r[top]<>0) then s2:='('+s2+')'; st[top]:=s2+'/'+s1; r[top]:=2; end; end; exit(st[top]); end; begin snum:=['a'..'z']; readln(n); for q:=1 to n do begin readln(s); s:=midfix_to_suffix(s); s:=suffix_to_midfix(s); writeln(s); end; end.