tsinsen(本地) 后缀转中缀
首先,前几天周老师对我们说了一句话:“有些人是表面学得好,有些人是内在学得好”。
这一道题目是9月的时候考试时碰上的,但是自己太水了,没有做出来,后面一直就没有动他,今天拿来做一做,发现向总给我们的算法真心不是很好啊。
我的方法。
我们用字符串数组存下他们,然后一个一个读取。
处理呢,用字符串数组是很方便的。
例如样例 CAB+-,
我们设st 为字符串数组,
先读取,有 st[1]='C' st[2]='A' st[2]='B';
遇到运算符号,就合并最后的两个字符串数组,并记录该数组的最低级别的运算符号,
例如st[2]合并成‘A+B',最低运算符号为’+';
如此往复,读取到字母就赋值给一个新的数组,独到运算符号就合并最后两个数组,做一个compare函数来判断是否需要加括号,每次合并时记更新该数组的最低级运算符号。
然后就有
C A+B
C-(A+B);
就可以了。 (顺便说一下,当该数组元素只有一个字母时,运算符号级别要设成最高级。)
但是vijos 上挖了3个点(总共只有五个点)!
算法肯定没错,但是绝对有考虑不全的地方,多半是compare函数的问题。
代码:
1 program p1293; 2 var 3 i,j,k,l,m,n,p:longint; 4 st:string; 5 s:array[1..200]of string; 6 ch,c:array[1..200]of char; 7 ch2:char; 8 function pan(a:char):boolean; 9 begin 10 if(ord(a)>=65)and(ord(a)<=90)then exit(true) 11 else exit(false); 12 end; 13 function compare(a,b:char):boolean; 14 var 15 x,y:longint; 16 begin 17 case(a)of 18 '+','-':x:=1; 19 '*','/':x:=3; 20 '@':x:=9; 21 end; 22 case(b)of 23 '+','-':y:=1; 24 '*','/':y:=3; 25 '@':y:=9; 26 end; 27 if x<y then compare:=true 28 else compare:=false; 29 end; 30 begin 31 assign(input,'p1293.in'); 32 reset(input); 33 for i:=1 to 200 do 34 c[i]:='@'; 35 n:=0; p:=0; 36 while not eoln do 37 begin 38 inc(n); 39 read(ch[n]); 40 end; 41 for i:=1 to n do 42 begin 43 if pan(ch[i]) then 44 begin 45 inc(p); 46 insert(ch[i],s[p],1); 47 end 48 else 49 begin 50 if compare(c[p-1],ch[i]) then 51 begin 52 insert('(',s[p-1],1); 53 insert(')',s[p-1],length(s[p-1])+1); 54 ch2:=ch[i]; 55 end 56 else ch2:=ch[i]; 57 if(not compare(ch[i],c[p]))and((ch[i]<>c[p])or((ch[i]=c[p])and((ch[i]<>'*')and(ch[i]<>'+'))))then 58 begin 59 insert('(',s[p],1); 60 insert(')',s[p],length(s[p])+1); 61 ch2:=ch[i]; 62 end 63 else ch2:=ch[i]; 64 s[p-1]:=s[p-1]+ch[i]+s[p]; 65 delete(s[p],1,length(s[p])); 66 c[p]:='@'; 67 dec(p); 68 c[p]:=ch2; 69 end; 70 end; 71 write(s[p]); 72 close(input); 73 end.