Selasa, 15 Maret 2011 - 0 komentar

Tugas Kedua untuk memenuhi mata kuliah SOD 2

Program Stack


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,
sedang 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);
stackie:= copy(stackie,1,panjangstackie-1);
panjangstackie:= length(stackie);
if pembanding1 <> '(' then Output:= output + pembanding1;
until panjangstackie = 0;
writeln('Outputnya adalah :');
writeln(Output);
readln;

end.