STACK (Tumpukan) Tumpukan Koin Tumpukan Kotak
Defenisi : Secara sederhana, tumpukan bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang diletakan diatas data yang lain. Satu hal yang perlu kita ingat adalah bahwa kita bisa menambah (menyisipkan) data, dan mengambil (menghapus) data lewat ujung yang sama, yang disebut sebagai ujung atas tumpukan (top of stack). Untuk menjelaskan pengertian diatas kita ambil contoh sebagai berikut. Misalnya kita mempunyai dua buah kotak yang kita tumpuk, sehingga kotak kita letakkan diatas kotak yang lain. Jika kemudian tumpukan duah buah kotak itu kita tambah dengan kotak ketiga, keempat dan seterusnya, maka akan kita peroleh sebuah tumpukan kotak yang terdiri dari N kotak.
D C B A Dari gambar ini kita bisa mengatakan bahwa kotak B ada diatas kotak A dan ada dibawah kotak C. Gambar dibawah ini hanya menunjukkan bahwa dalam tumpukan kita hanya bisa menambah atau mengambil sebuah kotak lewat satu ujung, yaitu ujung bagian atas
Pendefinisian Stack Cara mendefinisikan Stack dengan Array of Struct: 1. Definisikan Stack dengan menggunakan struct 2. Definisikan konstanta MAX_STACK untuk menyimpan maksimum isi Stack 3. Buatlah variabel array data sebagai implementasi Stack 4. Deklarasikan operasi-operasi/function di atas dan buat implementasinya
Deklarasi Deklarasi MAX_STACK #define MAX_STACK 10 (C); Const Max_Stack = 10 Deklarasi STACK dengan struct dan array data Typedef struct STACK{ STACK = record int top; top: integer; char data[10][10]; data: array[1..10]; Of char; }; end; Deklarasi/buat variabel dari struct STACK tumpuk; tumpuk: STACK;
Inisialisasi Stack Pada mulanya isi top dengan -1, karena array dimulai dari 0, yang berarti stack adalah KOSONG Ilustrasi
Top of stack akan selalu bergerak hingga mencapai MAX of STACK sehingga menyebabkan stack PENUH!
Maximum 5 4 3 2 1 0 Isi [5] Isi [4] Isi [3] Isi [2] Isi [1] Deklarasi Struktur Data Stack = Record Isi : array[1..n] of Tipe Data Atas : integer End Stack S
Operasi Operasi dasar yang dilakukan Dalam Stack ada dua yaitu : 1. Menambah Komponen (Push) 2. Menghapus Komponen (Pop) Operasi Push Operasi Push adalah Menambah elemen kedalam stack S, dimana penambahan dapat dilakukan jika stack itu belum penuh. Stack dikatakan penuh Jika posisi atas sudah berada pada posisi N (If S.atas = n then stack penuh) Push( x,s) adalah Memasukkan x kedalam Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then s.atas= s.atas+1 s.isi[s.atas] = x Else stack sudah penuh fi Atas = 0 Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.Atas = s.atas + 1 s.isi[s.atas] = x Else stack sudah penuh fi Atas = 1 Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.atas= s.atas+1 S.isi[S.atas] = k Else stack sudah penuh fi Atas = 1 Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.Atas = s.atas + 1 s.isi[s.atas] = x Else stack sudah penuh fi Atas = 2 Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.atas= s.atas+1 Atas = 2 S.isi[S.atas] = k Else stack sudah penuh fi Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.Atas = s.atas + 1 s.isi[s.atas] = x Else stack sudah penuh fi Atas = 3 Stack S
Push(x,s) Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.atas= s.atas+1 Atas = 3 S.isi[S.atas] = k Else stack sudah penuh fi Stack S
Push(x,s) Atas = 5 Procedure Push(x :Tipe data, S : Stack) If s.atas< n then S.atas= s.atas+1 S.isi[S.atas] = k Else fi stack sudah penuh Stack S
POP(S) Pop(s) adalah menghapus elemen dari stack, dimana elemen yang dihapus adalah elemen yang terakhir Masuk (LIFO Last In First Out) atau elemen penghapusan, dimana proses penghapusan dapat dilakukan jika stack tidak dalam keadaan Kosong If S.Atas > 0 then stack tidak kosong Dimana Setiap melakukan penghapusan, maka posisi yang paling atas akan berkurang 1 (S.Atas = S.Atas -1) Procedure Pop( S: Stack) If S.atas>0 then Else Stack Kosong Fi Write S.isi[S.atas] S.Atas= S.Atas 1
Pop(s) Atas = 5 Procedure Pop( S: Stack) If S.atas>0 then Write S.isi[S.atas] S.Atas= S.Atas 1 Else Stack Kosong Fi Stack S
Pop(s) Procedure Pop( S: Stack) If S.atas>0 then Write S.isi[S.atas] S.Atas= S.Atas 1 Else Stack Kosong Fi Atas = 4 Stack S
Pop(s) Procedure Pop( S: Stack) If S.atas>0 then Write S.isi[S.atas] S.Atas= S.Atas 1 Else Stack Kosong Fi Atas = 4 Stack S
Pop(s) Procedure Pop( S: Stack) If S.atas>0 then Write S.isi[S.atas] S.Atas= S.Atas 1 Else Stack Kosong Fi Atas = 3 Stack S
Pop(s) Procedure Pop( S: Stack) If S.atas>0 then Write S.isi[S.atas] S.Atas= S.Atas 1 Else Stack Kosong Fi Atas = 0 Stack S
Operasi Lain Operasi lain yang biasa digunakan pada Stack yaitu: Clear: digunakan untuk mengosongkan Stack IsEmpty: fungsi yang digunakan untuk mengecek apakah stack sudah kosong IsFull: fungsi yang digunakan untuk mengecek apakah stack sudah penuh
IsEmpty Dengan cara memeriksa top of stack, jika masih -1 maka berarti stack masih kosong
IsFull Dengan cara memeriksa top of stack, jika sudah sama dengan MAX_STACK-1 maka full, jika belum (masih lebih kecil dari MAX_STACK-1) maka belum full Ilustrasi
Print Untuk menampilkan semua elemen-elemen stack Dengan cara looping semua nilai array secara terbalik, karena kita harus mengakses dari indeks array tertinggi terlebih dahulu baru ke indeks yang kecil
Contoh Penggunaan Stack 1. Untuk mencek kalimat Polindrom 2. Untuk Mengubah Desimal ke Biner
Mencek Kalimat Polindrom Kalimat : KAKAK K A A K K K A A A A K K K K K Operasi Push
Operasi Pop K Hasil = A K A K A K A K K A K A K K Hasil = K Hasil = KA Hasil = KAK Hasil = KAKA Hasil = KAKAK Operasi POP Kalimat = hasil Polindrom
Algoritma Inisialisasi Struktur Data Stack = record isi : Array[1..255] of char atas : integer End Kalimat, Hasil : string Procedure push( x : Char, s : Stack) If s.atas < 255 Then s.atas = s.atas+1 s.isi[s.atas] = x Else stack sudah penuh fi
Procedure Pop(S:Stack) If S.atas>0 then Write s.isi[s.atas] Hasil = hasil +s.isi[s.atas] s.atas= s.atas-1 Else Stack Kosong Fi //modul utama i=1 While i<= length(kalimat) Do Push(Kalimat[i],s) i=i+1 E-while While S.atas>0 do pop(s) E-while If kalimat = hasil Then Polindrom Else Tidak polindrom fi
Tugas Buat Algoritma dan Program Untuk Mengkonversi Bilangan desimal menjadi bilangan Biner.
Ungkapan Aritmatika Untuk menuliskan ungkapan aritmatika dapat dilakukan dengan tiga metode Infix Operan Operator Operan A + B Prefix Operator Operan Operan + A B Postfix Operan Operan Operator A B +
Contoh : 1. Infix A + B + C Prefix +AB + C ++ABC Postfix AB+ + C AB+C+ 2. Infix A+B * C Prefix A+*BC +A*BC Postfix A+ BC* ABC*+ Hierarki Operator 1. ( ) Operator Logika: 2. ^ (pangkat) 1. NOT 3. /, *, DIV, MOD 2. AND 4. +, - 3. OR
Contoh 3: Infix A*B + C*D Prefix *AB + C * D *AB + *CD +*AB*CD Postfix AB* + C*D AB* + CD* AB*CD*+ Contoh 4 : Infix (4 3) * (12 / 3) Prefix *, -,4, 3, /, 12, 3 Postfix 4, 3, -, 12, 3, /, * Tentukan hasil dari : 1. 12, 7, 3, -, /, 2, 1, 5, +, *, + 2. 5 + 3 ^ 2 8 / 4 + 3 + 6 3. 3, 1, + 2, ^, 7, 4, -, 2, *, +, 5, - 4. (A * (( B + D) / E)) - (F * (G + (H / K)))
Infix : A + B * (C D) / E Prefix A + B * -CD / E A + *B-CD / E A + /*B-CDE +A/*B-CDE Postfix A + B * CD- / E A + BCD-* / E A + BCD-*E/ ABCD-*E/+ Contoh : 1. Infix (A+B)*C^D/E-F+G 2. Infix (A+B*C)*(D+E)/F*G
Stack Untuk Konversi Infix ke postfix Algoritma PostFix(Q, P) {Q=Infix, P=Postfix} 1. Masukkan ( ke dalam Stack dan ) ke akhir infix. 2. Telusuri Q sampai elemen yang terakhir 3. Jika menemukan Operand, maka masukkan ke P. 4. Jika menemukan (, maka masukkan ke dalam Stack. 5. Jika menemukan operator, maka : a. Ulangi POP(S) setiap Operator yang sama atau lebih tinggi hirarkinya dan masukkan ke P b. Masukkan operator tadi ke Stack. 6. Jika menemukan ), maka : a. Ulangi POP(S) setiap Operator sampai menemukan ( dan masukkan ke dalam P. b. Hapus ( 7. Selesai Contoh