Tuesday, March 15, 2011

Infix menjadi Postfix

Ini adalah sebuah tugas ke tiga dari mata kuliah Struktur & Organisasi Data 2, yang ada di Universitas Gunadarma, yang diajarkan pada 2KA 17 oleh Lily Wulandari.

Disini akan dituliskan Coding Pascal bagaimana mencari Postfix dari Infix yang diketahui.


Berikut adalah Coding nya :

program stack;

uses crt;

var Userinput, stackie, output, pembanding1,pembanding2 : string;
    tingkatan1, lanjut1, tingkatan2, jumlah, penghitung, penghitung1, panjangstackie, lanjut : integer;

begin
     clrscr;
     writeln('Ini adalah program untuk mengubah aritmatika infix menjadi postfix.');
     writeln('Program ini tidak men-"support" akar.');
     writeln('Tulis infix yang kamu inginkan.');
     readln (Userinput);
     jumlah := length(Userinput);

     (*Deklrasi Konstanta *)
     stackie := '';
     penghitung := 1;
     panjangstackie := 0;
     lanjut1 := 0;
     jumlah := length(Userinput);

     repeat
     penghitung1 := 1;
     lanjut := 0;
     (*Level Tingkatan *)
     pembanding1 := copy(userinput,penghitung,1);
     if pembanding1 = '+' then tingkatan1 := 1
         else if pembanding1 = '-' then tingkatan1 := 1
             else if pembanding1 = '/' then tingkatan1 := 2
                  else if pembanding1 = '*' then tingkatan1 := 2
                       else if pembanding1 = '^' then tingkatan1 := 3
                            else tingkatan1 := 0;


     (* Cek isi dari tingkatan1 jika level tingkatan termasuk 0. *)
     if tingkatan1 = 0 then
        if pembanding1 = '(' then
           begin
           stackie := stackie + pembanding1;
           panjangstackie:= length(stackie);
           lanjut := 1;
           penghitung:= penghitung+1;
           end
        else if pembanding1 = ')' then
           begin
       repeat
        pembanding2:= copy(stackie,panjangstackie,1);
        stackie:= copy(stackie,1,panjangstackie-1);
        panjangstackie:= length(stackie);
        if pembanding2 <> '(' then Output:= output + pembanding2;
       until copy(stackie,panjangstackie,1) = '(';

                penghitung:=penghitung+1;
                lanjut:= 1;
           end
         else
           begin
                output:= output + pembanding1;
                lanjut := 1;
                penghitung:= penghitung + 1;
           end;


     if lanjut = 0 then
     begin
     (*Lihat Stack *)
     repeat
     if stackie = '' then
        begin
        lanjut := 1;
        stackie:= stackie + pembanding1;
        penghitung:=penghitung + 1;
        end

        else
        begin
             pembanding2 := copy(stackie,panjangstackie,1);
             if pembanding2 = '+' then tingkatan2 := 1
                else if pembanding2 = '-' then tingkatan2 := 1
                     else if pembanding2 = '/' then tingkatan2 := 2
                          else if pembanding2 = '*' then tingkatan2 := 2
                               else if pembanding2 = '^' then tingkatan2 := 3
                                    else if pembanding2 = '(' then tingkatan2 := -1
                                          else tingkatan2 := 0;

             (* Kalau tingkatan stack yang lama lebih tinggi daripada
                pembanding yang baru, maka stack yang lama di keluarkan,
                sedangkan pembanding yang baru di masukkan ke stack. *)


                if tingkatan2 >= tingkatan1 then

                begin
                lanjut := 1;
                output := output + pembanding2;
                stackie := copy(stackie,1,panjangstackie - 1);
                stackie := stackie + pembanding1;
                panjangstackie := length(stackie);
                penghitung:= penghitung + 1;
                end

             (* Kalau stacknya sudah habis diperiksa, maka pembanding yang
                baru di tambahkan ke stack. *)
             else
                  begin
                  lanjut := 1;
                  stackie := stackie + pembanding1;
                  panjangstackie := length(stackie);
                  penghitung:= penghitung + 1;
                  end;
             penghitung1:= penghitung1 + penghitung;
                  (* Kalau stacknya belum habis diperiksa, maka ulangi
                     program. *)
     end;
     until lanjut = 1;
     end;
     until penghitung = jumlah+1;

         (*Ngehabisin yang masih ada di stack. *)

     repeat
        pembanding1:= copy(stackie,panjangstackie,1);
                pembanding2:= copy(stackie,panjangstackie-1,1);

                if pembanding1 = '+' then tingkatan1 := 1
                else if pembanding1 = '-' then tingkatan1 := 1
                     else if pembanding1 = '/' then tingkatan1 := 2
                          else if pembanding1 = '*' then tingkatan1 := 2
                               else if pembanding1 = '^' then tingkatan1 := 3
                                    else if pembanding1 = '(' then tingkatan1 := -1
                                          else tingkatan1 := 0;

                if pembanding2 = '+' then tingkatan2 := 1
                else if pembanding2 = '-' then tingkatan2 := 1
                     else if pembanding2 = '/' then tingkatan2 := 2
                          else if pembanding2 = '*' then tingkatan2 := 2
                               else if pembanding2 = '^' then tingkatan2 := 3
                                    else if pembanding2 = '(' then tingkatan2 := -1
                                          else tingkatan2 := 0;
                if tingkatan1 < tingkatan2 then
                   begin
                   if pembanding1 <> '(' then if pembanding2 <> '(' then Output:= output + pembanding2 + pembanding1;
                   stackie:= copy(stackie,1,panjangstackie-2);
                   panjangstackie:=length(stackie);
                   end
        else
                begin
                stackie:= copy(stackie,1,panjangstackie-1);
        panjangstackie:= length(stackie);
                if pembanding1 <> '(' then Output:= output + pembanding1;
                end;
     until panjangstackie = 0;
     writeln('Outputnya adalah :');
     writeln(Output);
     readln;

end.