比赛 |
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.