比赛 20100914 评测结果 AAAAAAAAAE
题目名称 表达式转换 最终得分 90
用户昵称 苏轼 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2010-09-14 19:47:45
显示代码纯文本
  1. Program BDtree (Input, Output);
  2.  
  3. Uses
  4. Math;
  5.  
  6. Type
  7. P_re= ^re;
  8. re=
  9. Record
  10. data: Char;
  11. left, right: P_re;
  12. End;
  13.  
  14. Var
  15. expr, hou: String;
  16. arr, i, j: Longint;
  17. num: Array[1..1000] Of Longint;
  18. outl: P_re;
  19.  
  20. Function Calcn (ch: Char; a, b: Longint): Longint;
  21. Begin
  22. Case ch Of
  23. '+': Exit(a+b);
  24. '-': Exit(a-b);
  25. '*': Exit(a*b);
  26. '/': Exit(a div b);
  27. '^': Exit(Trunc(Intpower(a,b)));
  28. End;
  29. End;
  30.  
  31. Function Calc (expr: String): P_re;
  32. Var
  33. ns: Array [1..100] Of P_re;
  34. os: Array [1..100] Of Char;
  35. code: Longint;
  36. tmp: P_re;
  37. i, nsn, osn, bas: Word;
  38. ts: String;
  39.  
  40. Function YXJ (c:char): Byte;
  41. Begin
  42. Case c Of
  43. '+', '-': YXJ:=0;
  44. '*', '/': YXJ:=1;
  45. '^': YXJ:=2;
  46. End;
  47. End;
  48.  
  49. Function Copr (op: Char; a, b: P_re):P_re;
  50. Var
  51. ans: P_re;
  52. Begin
  53. New (ans);
  54. ans^.data:=op;
  55. ans^.left:=a;
  56. ans^.right:=b;
  57.  
  58. Copr:=ans;
  59. End;
  60.  
  61. Begin
  62. i:=1;
  63. nsn:=0;
  64. osn:=0;
  65.  
  66. While i<=Length(expr) Do
  67. Begin
  68. If expr[i] in ['0'..'9'] Then
  69. Begin
  70. Inc(nsn);
  71.  
  72. New(ns[nsn]);
  73.  
  74. ns[nsn]^.data:=expr[i];
  75. ns[nsn]^.left:=NIL;
  76. ns[nsn]^.right:=NIL;
  77. End
  78. Else If expr[i] in ['+','-','*','/','^'] Then
  79. Begin
  80. If osn>0 Then
  81. While (osn>0) AND (YXJ(os[osn]) >= YXJ(expr[i])) Do
  82. Begin
  83. New(tmp);
  84. tmp:=Copr(os[osn],ns[nsn-1],ns[nsn]);
  85. ns[nsn-1]:=tmp;
  86. Dec(osn);
  87. Dec(nsn);
  88. End;
  89.  
  90. Inc(osn);
  91. os[osn]:=expr[i];
  92. End
  93. Else If expr[i] IN ['(',')'] Then
  94. Begin
  95. bas:=1;
  96. ts:='';
  97. Repeat
  98. Inc(i);
  99.  
  100. ts:=ts+expr[i];
  101.  
  102. If expr[i]='(' Then Inc(bas);
  103. If expr[i]=')' Then Dec(bas);
  104. Until (expr[i]=')') AND (bas=0);
  105.  
  106. Delete(ts, Length(ts), 1);
  107. Inc(nsn);
  108. ns[nsn]:=Calc(ts);
  109. End;
  110.  
  111. Inc(i);
  112. End;
  113.  
  114. While osn>0 Do
  115. Begin
  116. New(tmp);
  117. tmp:=Copr(os[osn],ns[nsn-1],ns[nsn]);
  118. ns[nsn-1]:=tmp;
  119. Dec(osn);
  120. Dec(nsn);
  121. End;
  122.  
  123. Calc:=ns[1];
  124. End;
  125.  
  126. Procedure Prnstr (add: P_re);
  127. Begin
  128. If add^.left<>NIL Then
  129. Prnstr(add^.left);
  130.  
  131. If add^.right<>NIL Then
  132. Prnstr(add^.right);
  133.  
  134. hou:=hou+add^.data;
  135. End;
  136.  
  137. Begin
  138. Assign(Input, 'express.in');
  139. Reset(Input);
  140.  
  141. Assign(Output, 'express.out');
  142. Rewrite(Output);
  143.  
  144. Readln(expr);
  145.  
  146. outl:=Calc(expr);
  147.  
  148. Prnstr(outl);
  149.  
  150. For i:=1 To Length(hou) Do
  151. Write(hou[i],' ');
  152. Writeln;
  153.  
  154. for i:=1 To Length(hou) Do
  155. If hou[i] in ['0'..'9'] Then
  156. Begin
  157. Inc(arr);
  158. num[arr]:=Ord(hou[i])-48;
  159. End
  160. Else
  161. Begin
  162. num[arr-1]:=Calcn(hou[i],num[arr-1],num[arr]);
  163. Dec(arr);
  164.  
  165. For j:=1 To arr Do
  166. Write(num[j],' ');
  167.  
  168. For j:=i+1 To Length(hou) Do
  169. Write(hou[j],' ');
  170.  
  171. Writeln;
  172. End;
  173.  
  174. Close(Input);
  175. Close(Output);
  176. End.