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.

Download