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.                         
posted @ 2012-12-01 21:14  改名字干什么  阅读(188)  评论(0编辑  收藏  举报