比赛 |
20100914 |
评测结果 |
AAAAAAAAAE |
题目名称 |
表达式转换 |
最终得分 |
90 |
用户昵称 |
苏轼 |
运行时间 |
0.000 s |
代码语言 |
Pascal |
内存使用 |
0.00 MiB |
提交时间 |
2010-09-14 19:47:45 |
显示代码纯文本
- Program BDtree (Input, Output);
-
- Uses
- Math;
-
- Type
- P_re= ^re;
- re=
- Record
- data: Char;
- left, right: P_re;
- End;
-
- Var
- expr, hou: String;
- arr, i, j: Longint;
- num: Array[1..1000] Of Longint;
- outl: P_re;
-
- Function Calcn (ch: Char; a, b: Longint): Longint;
- Begin
- Case ch Of
- '+': Exit(a+b);
- '-': Exit(a-b);
- '*': Exit(a*b);
- '/': Exit(a div b);
- '^': Exit(Trunc(Intpower(a,b)));
- End;
- End;
-
- Function Calc (expr: String): P_re;
- Var
- ns: Array [1..100] Of P_re;
- os: Array [1..100] Of Char;
- code: Longint;
- tmp: P_re;
- i, nsn, osn, bas: Word;
- ts: String;
-
- Function YXJ (c:char): Byte;
- Begin
- Case c Of
- '+', '-': YXJ:=0;
- '*', '/': YXJ:=1;
- '^': YXJ:=2;
- End;
- End;
-
- Function Copr (op: Char; a, b: P_re):P_re;
- Var
- ans: P_re;
- Begin
- New (ans);
- ans^.data:=op;
- ans^.left:=a;
- ans^.right:=b;
-
- Copr:=ans;
- End;
-
- Begin
- i:=1;
- nsn:=0;
- osn:=0;
-
- While i<=Length(expr) Do
- Begin
- If expr[i] in ['0'..'9'] Then
- Begin
- Inc(nsn);
-
- New(ns[nsn]);
-
- ns[nsn]^.data:=expr[i];
- ns[nsn]^.left:=NIL;
- ns[nsn]^.right:=NIL;
- End
- Else If expr[i] in ['+','-','*','/','^'] Then
- Begin
- If osn>0 Then
- While (osn>0) AND (YXJ(os[osn]) >= YXJ(expr[i])) Do
- Begin
- New(tmp);
- tmp:=Copr(os[osn],ns[nsn-1],ns[nsn]);
- ns[nsn-1]:=tmp;
- Dec(osn);
- Dec(nsn);
- End;
-
- Inc(osn);
- os[osn]:=expr[i];
- End
- Else If expr[i] IN ['(',')'] Then
- Begin
- bas:=1;
- ts:='';
- Repeat
- Inc(i);
-
- ts:=ts+expr[i];
-
- If expr[i]='(' Then Inc(bas);
- If expr[i]=')' Then Dec(bas);
- Until (expr[i]=')') AND (bas=0);
-
- Delete(ts, Length(ts), 1);
- Inc(nsn);
- ns[nsn]:=Calc(ts);
- End;
-
- Inc(i);
- End;
-
- While osn>0 Do
- Begin
- New(tmp);
- tmp:=Copr(os[osn],ns[nsn-1],ns[nsn]);
- ns[nsn-1]:=tmp;
- Dec(osn);
- Dec(nsn);
- End;
-
- Calc:=ns[1];
- End;
-
- Procedure Prnstr (add: P_re);
- Begin
- If add^.left<>NIL Then
- Prnstr(add^.left);
-
- If add^.right<>NIL Then
- Prnstr(add^.right);
-
- hou:=hou+add^.data;
- End;
-
- Begin
- Assign(Input, 'express.in');
- Reset(Input);
-
- Assign(Output, 'express.out');
- Rewrite(Output);
-
- Readln(expr);
-
- outl:=Calc(expr);
-
- Prnstr(outl);
-
- For i:=1 To Length(hou) Do
- Write(hou[i],' ');
- Writeln;
-
- for i:=1 To Length(hou) Do
- If hou[i] in ['0'..'9'] Then
- Begin
- Inc(arr);
- num[arr]:=Ord(hou[i])-48;
- End
- Else
- Begin
- num[arr-1]:=Calcn(hou[i],num[arr-1],num[arr]);
- Dec(arr);
-
- For j:=1 To arr Do
- Write(num[j],' ');
-
- For j:=i+1 To Length(hou) Do
- Write(hou[j],' ');
-
- Writeln;
- End;
-
- Close(Input);
- Close(Output);
- End.