23
STACK (TUMPUKAN) STACK (TUMPUKAN) Definisi dan operator, Definisi dan operator, al al gor gor itma dalam bentuk itma dalam bentuk lo lo g g i i c c , implementasi , implementasi dengan tabel dan pointer. dengan tabel dan pointer.

SD 2 Stack

  • Upload
    untan

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

STACK (TUMPUKAN)STACK (TUMPUKAN)Definisi dan operator, Definisi dan operator, alalgorgoritma dalam bentuk itma dalam bentuk lologgiicc, implementasi , implementasi

dengan tabel dan pointer.dengan tabel dan pointer.

DefinisiDefinisi Data yang diletakkan diatas Data yang diletakkan diatas data lainnya.data lainnya.

Bisa menambah/menyisipkan dataBisa menambah/menyisipkan data Bisa menghapus dataBisa menghapus data E.g. Tumpukan PiringE.g. Tumpukan Piring Last In First OutLast In First Out DD

CCBBAA

PENYAJIANPENYAJIAN Bisa menggunakan ARRAY, tetapi kurang Bisa menggunakan ARRAY, tetapi kurang tepat. Kecuali Array Dinamis.tepat. Kecuali Array Dinamis.

Elemen tumpukan bisa sangat bervariasiElemen tumpukan bisa sangat bervariasi ARRAY bisa digunakan, kalau elemen ARRAY bisa digunakan, kalau elemen tumpukan tidak melebihi batas maksimum.tumpukan tidak melebihi batas maksimum.

Melebihi batas Melebihi batas overflowoverflow Tipe yang bisa digunakan : Tipe yang bisa digunakan : RECORDRECORD Manipulasi dengan menggunakan Manipulasi dengan menggunakan

RECORD RECORD yakni dengan dua medan, yakni dengan dua medan, yakni medan penyimpan elemen yakni medan penyimpan elemen tumpukan, dan medan pencatatumpukan, dan medan pencatatt posisi ujung atas tumpukanposisi ujung atas tumpukan

PENYAJIANPENYAJIANContohContohconst MaxElemen = 255;const MaxElemen = 255;type tumpukan = recordtype tumpukan = record

isi : array[1..MaxElemen] of isi : array[1..MaxElemen] of integer;integer;

atas : 0..MaxElemen;atas : 0..MaxElemen;end;end;

var T : Tumpukan;var T : Tumpukan;

PENYAJIANPENYAJIAN Tumpukan T berelemen T.isi bertipe Tumpukan T berelemen T.isi bertipe integerinteger

Banyak elemen 255 (maxElemen)Banyak elemen 255 (maxElemen) Jika T.atas = 5, tumpukan = 5 Jika T.atas = 5, tumpukan = 5 elemen.elemen.

Jika ada n data yang diambil, maka Jika ada n data yang diambil, maka T.atas = 5-nT.atas = 5-n

Jika ada n data yang ditambah, Jika ada n data yang ditambah, maka T.atas = 5+nmaka T.atas = 5+n

Operasi TumpukanOperasi Tumpukan Menyisipkan data ( PUSH )Menyisipkan data ( PUSH ) Menghapus data ( POP )Menghapus data ( POP )

PushPush Menambahkan / menyisipkan data ke Menambahkan / menyisipkan data ke dalam tumpukandalam tumpukan

Tidak bisa menambahkan data pada Tidak bisa menambahkan data pada tumpukan yang sudah penuh (overflow)tumpukan yang sudah penuh (overflow)

Algoritma :Algoritma :if t.atas = maxelemen thenif t.atas = maxelemen thenwrite(‘sudah penuh’) elsewrite(‘sudah penuh’) elsebeginbegin {naikkan posisi tumpukan}{naikkan posisi tumpukan} {tambah isi tumpukan}{tambah isi tumpukan}end;end;

PushPushprocedure push (var t:tumpukan; penuh:boolean; procedure push (var t:tumpukan; penuh:boolean; x:integer);x:integer);

beginbegin if t.atas = maxelemen thenif t.atas = maxelemen then penuh := true elsepenuh := true else beginbegin penuh := false;penuh := false; t.atas := inc(t.atas);t.atas := inc(t.atas); t.isi[t.atas] := x;t.isi[t.atas] := x; end;end;end;end;

pemanggilan pemanggilan push(t,penuh,x); push(t,penuh,x);

PopPop Menghapus elemen yang ada diposisi Menghapus elemen yang ada diposisi paling ataspaling atas

Menghapus posisi juga akan menghapus Menghapus posisi juga akan menghapus elemenelemen

Tidak mungkin menghapus elemen ketika Tidak mungkin menghapus elemen ketika tumpukan sudah kosong. (t.atas = 0)tumpukan sudah kosong. (t.atas = 0)

Algoritma :Algoritma :if t.atas = 0 thenif t.atas = 0 then write(‘tumpukan kosong’) elsewrite(‘tumpukan kosong’) else

{kurangi t.atas}{kurangi t.atas}

PopPopfunction pop (var t : tumpukan) : integer;function pop (var t : tumpukan) : integer;beginbegin if t.atas = 0 thenif t.atas = 0 then pop := 0 elsepop := 0 else beginbegin pop := t.isi[t.atas];pop := t.isi[t.atas]; t.atas := dec(t.atas);t.atas := dec(t.atas); end;end;end;end;

Dalam program utama kita dapat Dalam program utama kita dapat memanggil fungsi tersebut dengan memanggil fungsi tersebut dengan

X := POP(T);X := POP(T);

Contoh Penggunaan STACKContoh Penggunaan STACK Contoh berikut adalah contoh dari Contoh berikut adalah contoh dari pengguanaan kalimat dengan melakukan pengguanaan kalimat dengan melakukan pembalikan kalimat. Sebuah kalimat pembalikan kalimat. Sebuah kalimat ditumpuk ke dalam stack dan kemudian ditumpuk ke dalam stack dan kemudian di ambil dengan aturan LIFO, sebagai di ambil dengan aturan LIFO, sebagai contoh:contoh:INI ADALAH KALIMATINI ADALAH KALIMATakan ditumpuk dan diambil sehingga akan ditumpuk dan diambil sehingga menjadi:menjadi:TAMILAK HALADA INITAMILAK HALADA INI

Program Balik KalimatProgram Balik Kalimatprogram BALIK_KALIMAT;program BALIK_KALIMAT;uses crt;uses crt;const Elemen = 255; const Elemen = 255; type S255 =type S255 = string[Elemen];string[Elemen]; Tumpukan =Tumpukan = recordrecord

Isi : S255;Isi : S255;Atas : 0..ElemenAtas : 0..Elemen;;

end;end;

varvar TT : Tumpukan; : Tumpukan;II : integer; : integer;Kalimat : S255;Kalimat : S255;

Program Balik KalimatProgram Balik Kalimatprocedure AWALAN (var T : Tumpukan);procedure AWALAN (var T : Tumpukan);beginbeginT.Atas := 0T.Atas := 0;;

end;end;

procedure PUSH(var procedure PUSH(var TT : Tumpukan; X :char); : Tumpukan; X :char);beginbegin T.Atas := T.Atas + 1;T.Atas := T.Atas + 1; T.Isi[T.Atas] := XT.Isi[T.Atas] := X;;end;end;

function POP (var function POP (var TT : Tumpukan) : char; : Tumpukan) : char;beginbeginPOP := T.Isi[T.Atas];POP := T.Isi[T.Atas];T.Atas := T.Atas – 1T.Atas := T.Atas – 1;;

end;end;

Program Balik KalimatProgram Balik Kalimatbeginbegin

clrscr; clrscr; Awalan(T);Awalan(T);writeLn(‘MEMBALIK KALIMAT MENGGUNAKAN TUMPUKAN’);writeLn(‘MEMBALIK KALIMAT MENGGUNAKAN TUMPUKAN’);writeLn(‘-------------------------------------’);writeLn(‘-------------------------------------’);writeLn;writeLn;write (‘Isikan sembarang kalimat: ’); readln(Kalimat);write (‘Isikan sembarang kalimat: ’); readln(Kalimat);clrscr; writeln(‘KALIMAT ASLI:’); writeln(Kalimat);clrscr; writeln(‘KALIMAT ASLI:’); writeln(Kalimat);writeln;writeln(‘SETELAH DIBALIK:’);writeln;writeln(‘SETELAH DIBALIK:’);

for I := 1 to length(Kalimat) dofor I := 1 to length(Kalimat) do PUSH (T,Kalimat[I]); PUSH (T,Kalimat[I]); for I := 1 to length(Kalimat) dofor I := 1 to length(Kalimat) dowrite(POP(T));write(POP(T));

writelnwritelnend.end.

Program Balik KalimatProgram Balik KalimatOUTPUT:OUTPUT:MEMBALIK KALIMAT MENGGUNAKAN TUMPUKANMEMBALIK KALIMAT MENGGUNAKAN TUMPUKAN--------------------------------------------------------------------------Isikan sembarang kalimat: Isikan sembarang kalimat: SBY COY!!SBY COY!!KALIMAT ASLI: KALIMAT ASLI: SBY COY!!SBY COY!!

SETELAH DIBALIK: SETELAH DIBALIK: !!YOC YBS!!YOC YBS

Contoh Penggunaan STACKContoh Penggunaan STACKPenulisan Ungkapan NumerisPenulisan Ungkapan Numeris Salah satu pemanfaatan tumpukan adalah untuk Salah satu pemanfaatan tumpukan adalah untuk menulis ungkapan menggunakan notasi tertentumenulis ungkapan menggunakan notasi tertentu

Notasi yang kita ketahui selama ini selalu Notasi yang kita ketahui selama ini selalu menggunakan tanda kurung untuk mengelompokkan menggunakan tanda kurung untuk mengelompokkan bagian mana yang dikerjakan terlebih dahulu, bagian mana yang dikerjakan terlebih dahulu, seperti contoh berikut:seperti contoh berikut:(A + B) * (C – D)(A + B) * (C – D)

Bagian (A + B) dikerjakan terlebih dahulu, baru Bagian (A + B) dikerjakan terlebih dahulu, baru kemudian (C – D) setelah itu baru dikalikankemudian (C – D) setelah itu baru dikalikan

Notasi di atas sering disebut Notasi di atas sering disebut notasi infixnotasi infix Dalam ungkapan rumit yang banyak menggunakan Dalam ungkapan rumit yang banyak menggunakan tanda kurung, penulisannya akan semakin sulit, tanda kurung, penulisannya akan semakin sulit, karena itu dibuatlah notasi lain yang disebut karena itu dibuatlah notasi lain yang disebut sebagai notasi sebagai notasi prefix/polishprefix/polish

Notasi NumerisNotasi Numeris Notasi Notasi prefixprefix menuliskan operator menuliskan operator sebelum kedua operand yang akan sebelum kedua operand yang akan disajikandisajikan

Contoh penggunaan notasi infixContoh penggunaan notasi infixInfixInfix PrefixPrefixA + BA + B + A B+ A BA + B – CA + B – C – + A B C– + A B C(A + B) * (C – D)(A + B) * (C – D) * + A B – C D* + A B – C D

Notasi lain yang dipergunakan adalah Notasi lain yang dipergunakan adalah notasi postfix yang merupakan kebalikan notasi postfix yang merupakan kebalikan dari notasi infix atau dikenal sebagai dari notasi infix atau dikenal sebagai notasi Polish Terbalik (notasi Polish Terbalik (Reverse Polish Reverse Polish NotationNotation))

Notasi NumerisNotasi Numeris Pada notasi postfix operator ditulis Pada notasi postfix operator ditulis setelah kedua operand yang disajikansetelah kedua operand yang disajikan

Contoh penggunaan notasi postfixContoh penggunaan notasi postfixInfixInfix PostfixPostfixA + BA + B A B +A B +A + B – CA + B – C A B + C –A B + C –(A + B) * (C – D)(A + B) * (C – D) A B + C D – *A B + C D – *

Latihan:Latihan:Buat ke notasi prefix dan postfixBuat ke notasi prefix dan postfixA – B / (C * D A – B / (C * D ^̂ E) E)(A + B) * C – D / E + F * G (A + B) * C – D / E + F * G ^̂ H H((A * B) – C) / ((A * B) – C) / ((((D + E) / F) + G((D + E) / F) + G))

Program Infix ke postfixProgram Infix ke postfixprogram INFIX_TO_POSTFIX; program INFIX_TO_POSTFIX; uses crt; uses crt; const Max_ELemen = 255;const Max_ELemen = 255;typetype S255 = string [Max_Elemen];S255 = string [Max_Elemen];

Tumpukan = recordTumpukan = recordRinci : S255;Rinci : S255;Atas : 0..Max_ElemenAtas : 0..Max_Elemen

end;end;var var Infix : S255;Infix : S255;

Lagi : char;Lagi : char;

function VALENSI (Tanda_0p : char) : integer;function VALENSI (Tanda_0p : char) : integer;begin begin case Tanda_0p ofcase Tanda_0p of

‘‘^̂’’ : : VALENSI:=VALENSI:= 3;3;‘‘*’,’/’ :*’,’/’ : VALENSI :=VALENSI := 2;2;‘‘+’,‘-’ :+’,‘-’ : VALENSI :=VALENSI := 1;1;‘‘(’(’ : : VALENSI :=VALENSI := 00

end;end;end;end;

Program Infix ke postfixProgram Infix ke postfixprocedure PUSH(var T : Tumpukan; Elemen : char);procedure PUSH(var T : Tumpukan; Elemen : char);beginbegin T.Atas := T.Atas + 1;T.Atas := T.Atas + 1; T.Rinci[T.Atas] := ElemenT.Rinci[T.Atas] := Elemenend;end;

function POP (var T : Tumpukan) : char;function POP (var T : Tumpukan) : char;beginbegin POP := T.Rinci[T.Atas];POP := T.Rinci[T.Atas]; T.Atas := T.ATas - 1T.Atas := T.ATas - 1end; end;

procedure KONVERSI_CETAK(Infix : S255);procedure KONVERSI_CETAK(Infix : S255);varvar II : integer;: integer;

operatoroperator : set of char;: set of char;Temp,KarTemp,Kar : char;: char;TT : Tumpukan;: Tumpukan;

Program Infix ke postfixProgram Infix ke postfixbegin begin operator := [‘operator := [‘^̂’]+[‘*’]+[‘/’]+[‘+’]+[‘-‘]’]+[‘*’]+[‘/’]+[‘+’]+[‘-‘] for I := 1 to length(Infix) dofor I := 1 to length(Infix) do

beginbeginKar := Infix[I];Kar := Infix[I];if Kar = ‘(’ then PUSH(T,Kar)if Kar = ‘(’ then PUSH(T,Kar)else if Kar = ‘)’ thenelse if Kar = ‘)’ then

beginbeginwhile T.Rinci[T.Atas] <> ‘(‘ dowhile T.Rinci[T.Atas] <> ‘(‘ do

write(POP(T):2);write(POP(T):2);Temp := POP(T)Temp := POP(T)

endendelse if Kar in Operator thenelse if Kar in Operator then

beginbegin

Program Infix ke postfixProgram Infix ke postfixwhile (T.Atas <> 0) andwhile (T.Atas <> 0) and (VALENSI(Kar) <= VALENSI(T.Rinci[T.Atas])) do (VALENSI(Kar) <= VALENSI(T.Rinci[T.Atas])) do write(POP(T):2);write(POP(T):2); PUSH(T,Kar)PUSH(T,Kar)

endendelse if Kar ' 'else if Kar ' ' thenthen

write(Kar:2)write(Kar:2)end;end;

if T.Atas <> 0 thenif T.Atas <> 0 then repeatrepeat

write(POP(T):2)write(POP(T):2)untiluntil T.Atas = 0;T.Atas = 0;

end;end;

Program Infix ke postfixProgram Infix ke postfixbeginbegin

ctlscr;ctlscr;writeln(‘MENGUBAwriteln(‘MENGUBAHH NOTASI INFIX MENJADI POSTFIX’); NOTASI INFIX MENJADI POSTFIX’);writeLn(‘DENGAN MEMANFAwriteLn(‘DENGAN MEMANFAATATKAN STRUKTUR TUMPUKAN’);KAN STRUKTUR TUMPUKAN’);writeln(‘------------------------------------‘); writeLn;writeln(‘------------------------------------‘); writeLn;

repeat repeat write(‘Masukkan ungkapan infix: ‘); readln(Infix); write(‘Masukkan ungkapan infix: ‘); readln(Infix);

writeln; write('Ungkapan postfix: ‘);writeln; write('Ungkapan postfix: ‘); KONVERSI_CETAK (Infix);KONVERSI_CETAK (Infix); writeLn; writeln;writeLn; writeln; write('Akan coba Lagi? Ya/Tidak): ');readln(Lagi);write('Akan coba Lagi? Ya/Tidak): ');readln(Lagi); writelnwritelnuntil not (Lagi in [‘Y’,’y’])until not (Lagi in [‘Y’,’y’])

end.end.