MMASS - Mass of Molecule
Tác giả: ll931110
Ngôn ngữ: Pascal
Program MMASS;
Const
input = '';
output = '';
Var
s: string;
k,r: ansistring;
stack: ansistring;
q: array[1..1000] of integer;
top: integer;
Procedure convert1;
Var
f: text;
i: integer;
Begin
Assign(f, input);
Reset(f);
Readln(f, s);
Close(f);
k:= s[1];
For i:= 2 to length(s) do
If ('2' <= s[i]) and (s[i] <= '9') then
Begin
k:= k + ' * ';
k:= k + s[i];
End
else if (s[i] = 'C') or (s[i] = 'H') or (s[i] = 'O') or (s[i] = '(') then
Begin
If s[i - 1] <> '(' then k:= k + ' + ';
k:= k + s[i];
End
else k:= k + s[i];
End;
Function priority(ch: char): integer;
Begin
Case ch of
'*': priority:= 2;
'+': priority:= 1;
'(': priority:= 0;
End;
End;
Function pop: char;
Begin
pop:= stack[length(stack)];
Delete(stack, length(stack), 1);
End;
Function get: char;
Begin
get:= stack[length(stack)];
End;
Procedure convert2;
Var
i,top: integer;
x: char;
Begin
r:= '';
stack:= '';
For i:= 1 to length(k) do
Case k[i] of
'(': stack:= stack + k[i];
')': Repeat
x:= pop;
If x <> '('then r:= r + x + ' ';
Until x = '(';
'+','*': Begin
While (stack <> '')
and (priority(k[i]) <= priority(get)) do r:= r + pop + ' ';
stack:= stack + k[i];
End
else
r:= r + k[i] + ' ';
End;
While stack <> '' do r:= r + pop + ' ';
End;
Procedure pushval(v: integer);
Begin
inc(top);
q[top]:= v;
End;
Function popval: integer;
Begin
popval:= q[top];
dec(top);
End;
Procedure convert3;
Var
f: text;
i,m1,m2: integer;
Begin
top:= 0;
For i:= 1 to length(r) do
If r[i] = 'C' then pushval(12)
else if r[i] = 'H' then pushval(1)
else if r[i] = 'O' then pushval(16)
else if ('2' <= r[i]) and (r[i] <= '9') then pushval(ord(r[i]) - 48)
else if (r[i] = '+') or (r[i] = '*') then
Begin
m2:= popval;
m1:= popval;
If r[i] = '+' then m1:= m1 + m2;
If r[i] = '*' then m1:= m1 * m2;
pushval(m1);
End;
Assign(f, output);
Rewrite(f);
Writeln(f,popval);
Close(f);
End;
Begin
convert1;
convert2;
convert3;
End.