program stack_by_Ardian_dkk;
uses
        crt;
type
        list = array[1..50] of char;
        list2 = array[1..50] of integer;
var
        form : string;
        j,i, x : integer;
        stack : list;
        pri: list2;
        opr: set of char;
        kr: char;

begin
        clrscr;
        j := 0;
        opr:=['^']+['/']+['*']+['+']+['-'];
        writeln('Program konversi infix to postfix');
        write('Notasi Infix   : '); readln(form);
        write('Notasi Postfix : ');
        for i := 1 to length(form) do
                begin
                        kr := form[i];
                        if(kr = '(') then
                                begin
                                        j:=j+1;
                                        stack[j] := kr;
                                        pri[j]:=1;

                                end
                        else if(kr = ')') then
                                begin
                                        while (stack[j] <> '(') do
                                                begin
                                                        write(stack[j]);
                                                        j:=j-1;
                                                end;
                                        if (stack[j]='(') then j:=j-1;
                                end
                        else if(kr in opr) then
                                begin
                                        j:=j+1;
                                        case kr of
                                                '^'     : pri[j] := 4;
                                                '*','/' : pri[j] := 3;
                                                '+','-' : pri[j] := 2;
                                        end;
                                        while (pri[j] <= pri[j-1]) do
                                                begin
                                                        write(stack[j-1]);
                                                        pri[j-1] := pri[j];
                                                        j:=j-1;

                                                end;
                                        stack[j]:=kr;
                                end
                        else if(kr = ';') then 
                                begin
                                        for x:=j downto 1 do 
                                                begin
                                                        write(stack[x]);
                                                        j:=j-1;
                                                end
                                end
                        else if(kr <> ' ') then write(kr);
                end;
        for x:=j downto 1 do write(stack[x]);
readln;
end.