STACK Denny Agustiawan,M.pd STRUKTUR DATA STACK Denny Agustiawan,M.pd STMIK Asia Malang – 2011
LINEAR LIST Linear List adalah suatu struktur data yang merupakan himpunan terurut. Misal didefinisikan suatu linear list A yang terdiri atas T buah elemen sebagai berikut : A = [a1, a2, .........., aT] Jika T = 0, maka A dikatakan sebagai “Null List”. Suatu elemen dari sembarang posisi pada linear list A dapat dihilangkan. Sebaliknya, suatu elemen baru dapat dimasukkan ke dalam list dan dapat menempati sembarang posisi pada list tersebut. Jadi suatu linear list dapat berkurang atau bertambah setiap saat.
DEFINISI STACK Dalam istilah bahasa Indonesia, berarti tumpukan. Dalam istilah struktur data, berarti setiap akses data (baik penambahan atau pengurangan data) hanya dapat dilakukan pada satu ujung saja (TOP). Stack adalah suatu bentuk khusus dari linear list di mana operasi penyisipan dan penghapusan atas elemen-elemennya hanya dapat dilakukan pada satu sisi saja yang disebut sebagai “TOP”
STACK Misal diberikan Stack S sebagai berikut : S = [ S1, S2, .........., ST ] maka TOP(S) = ST Untuk menunjukkan jumlah elemen suatu stack digunakan notasi NOEL. Dari stack di atas, maka NOEL(S) = T. Ada 2 istilah dalam operasi stack PUSH : penambahan data (insert / add) POP : pengurangan / penghapusan data (delete)
Proses Push dan Pop pada Stack Contoh Stack A DELETE TOP POP B PUSH A A TOP PUSH B TOP A B TOP Proses Push dan Pop pada Stack
Penggambaran Stack Selanjutnya, jika diberikan sebuah stack S = [A,B,C,D], maka stack S ini dapat digambarkan sebagai berikut :
Penggunaan Vektor untuk Stack Ada 2 data penting Maxstack = data yang menunjukkan jumlah maksimum elemen stack yang dapat disimpan dalam vektor TOP, variabel yang bertujuan mencatat lokasi “puncak” dari stack.
Penggunaan Vektor untuk Stack INITIALIZE (S) MaxStack = 3 Push (S,”a”) Push (S,”b”) Push (S,”c”) Push (S,”d”) Pop(S,x) Pop(S,y) Pop(S,z) 5 b a c message “full stack” 1 2 a 3 a b 4 b a c 8 message “empty stack” 6 a b 7 a
OPERASI DASAR PADA STACK Ada empat operasi dasar yang didefinisikan pada stack, yaitu : CREATE(stack) ISEMPTY(stack) PUSH(elemen,stack) POP(stack)
CREATE Operator ini berfungsi untuk membuat sebuah stack kosong dan didefinisikan bahwa : NOEL(CREATE(S)) = 0 dan TOP(CREATE(S)) = null
ISEMPTY Operator ini berfungsi untuk menentukan apakah suatu stack adalah stack kosong. Operasinya akan bernilai boolean, dengan definisi sebagai berikut : ISEMPTY(S) = true, jika S adalah stack kosong = false, jika S bukan stack kosong atau ISEMPTY(S) = true, jika NOEL(S) = 0 = false, jika NOEL(S) ≠0 Catatan : ISEMPTY(CREATE(S)) = true.
PUSH Operator ini berfungsi untuk menambahkan satu elemen ke dalam stack. Notasi yang digunakan adalah : PUSH(E,S) Artinya menambahkan elemen E ke dalam stack S Elemen yang baru masuk ini akan menempati posisi TOP. Jadi : TOP(PUSH(E,S)) = E Akibat dari operasi ini jumlah elemen dalam stack akan bertambah, artinya NOEL(S) menjadi lebih besar atau stack menjadi tidak kosong (ISEMPTY(PUSH(E,S)) = false).
POP Operator ini berfungsi untuk mengeluarkan satu elemen dari dalam stack. Notasinya : POP(S) Elemen yang keluar dari dalam stack adalah elemen yang berada pada posisi TOP. Akibat dari operasi ini jumlah elemen stack akan berkurang atau NOEL(S) berkurang dan elemen pada posisi TOP akan berubah. Operator POP ini tidak dapat digunakan pada stack kosong, artinya : POP(CREATE(S)) = error condition Catatan : TOP(PUSH(E,S)) = E
Procedure & Function dlm Stack Function Full (S : Stacktype) {untuk mengetahui apakah S sudah penuh atau belum} BEGIN Full := (S.Top = maxstack) END Jika Stack S full, maka nilai ini = true, atau jika S belum penuh, maka nilai menunjukkan false. Function Empty (S : Stacktype) {untuk mengetahui apakah S sudah kosong atau belum} Empty := (S.Top = 0) Jika stack S empty, maka nilai = true, jika stack S tidak kosong nilai = false.
Procedure & Function dlm Stack 3. Function Top Value : Tdata BEGIN Top_Value := S.Isi[S.Top] END 4. Function Pop : Tdata Pop := S.Isi [S.Top]; S.Top := S.Top – 1; 5. Procedure Push (Data :Tdata) S.Top := S.Top + 1 S.Isi[S.Top] := Data
DEKLARASI STACK PADA BAHASA PEMROGRAMAN Dalam bahasa pemrograman, untuk menempatkan stack biasanya digunakan sebuah array. Tetapi perlu diingat di sini bahwa stack dan array adalah dua hal yang berbeda. Misalkan suatu variabel S adalah sebuah stack dengan 100 elemen. Diasumsikan elemen S adalah integer dan jumlah elemennya maksimum adalah 100 elemen. Untuk mendeklarasikan stack dengan menggunakan array, harus dideklarasikan pula variabel lain yaitu TOP_PTR yang merupakan indeks dari array. Variabel TOP_PTR ini digunakan untuk menyatakan elemen yang berada pada posisi TOP dalam stack tersebut. Selanjutnya gabungan kedua variabel ini diberi nama STACK_STRUCT.
Kemudian didefinisikan bahwa : NOEL(S) = TOP_PTR ISEMPTY(S) = TRUE jika TOP_PTR = 0 dan = FALSE jika TOP_PTR > 0
Maka bentuk deklarasinya dalam PASCAL adalah : TYPE Stack_Struct = Record Stack : array[1..100] of integer; TopPtr : integer; End; VAR S : Stack_Struct;
Selanjutnya, untuk keperluan operasi PUSH dan POP harus dibuat suatu prosedur tersendiri, yaitu : PROCEDURE PUSH(Eon : integer); Begin If (S.TopPtr < NoelMax) Then Begin S.TopPtr := S.TopPtr + 1; S.Stack [S.TopPtr] := Eon End Else Overflow_Condition End;
PROCEDURE POP(Eoff : integer); Begin If (S.TopPtr > 0) Then Begin Eoff := S.Stack[S.TopPtr]; S.TopPtr := S.TopPtr - 1 End Else Underflow_Condition End; Catatan : Overflow adalah suatu keadaan di mana kita melakukan operasi PUSH terhadap stack dalam keadaan penuh. Underflow adalah keadaan di mana kita melakukan operasi POP terhadap stack kosong. Eon adalah elemen yang akan dimasukkan ke dalam stack dan Eoff adalah elemen yang akan dikeluarkan dari dalam stack.
PENGGUNAAN/ APLIKASI STACK Logika stack digunakan untuk menyelesaikan berbagai macam masalah. Antara lain digunakan pada compiler, operating system dan dalam program-program aplikasi. Berikut ini tiga buah contoh aplikasi stack: MATCHING PARENTHESES NOTASI POSTFIX PROSES REKURSIF
MATCHING PARENTHESES Proses ini dilakukan compiler untuk memeriksa kelengkapan tanda kurung yang terdapat pada suatu ekspresi aritmetik. Sedangkan stack di sini digunakan sebagai tempat prosesnya. Algoritma yang digunakan adalah : Elemen-elemen suatu ekspresi aritmetik (string) di-Scan dari kiri ke kanan. Jika ditemukan simbol "(" atau "Left parenthesis", maka simbol tersebut di-push ke dalam stack. Jika ditemukan simbol ")" atau "Right parenthesis", maka isi stack diperiksa. Jika stack kosong terjadi kesalahan. berarti : ada simbol ")", tetapi tidak ada simbol "(" yang seharusnya mendahului. Jika stack tidak kosong artinya ada pasangannya dan langsung di-POP keluar stack. Misalkan NEXT CHAR adalah suatu karakter terakhir dalam suatu string.
NOTASI POSTFIX Bentuk aplikasi stack yang lain adalah mengubah suatu ekspresi aritmatik (string) ke dalam notasi postfix. Notasi postfix ini digunakan oleh compiler untuk menyatakan suatu ekspresi aritmatik dalam bahasa tingkat tinggi (high level language). Stack digunakan oleh compiler untuk mentransformasikan ekspresi aritmatik menjadi suatu ekspresi dalam bentuk/notasi postfix.
PROSES REKURSIF Stack juga dapat digunakan untuk menelusuri suatu program atau procedure yang rekursif. Berikut ini sebuh contoh yang menyelesaikannya menggunakan proses rekursif. Persoalan : Agar diperoleh uang sebanyak 1.000.000 rupiah pada 25 tahun yang akan datang, berapakah banyak uang yang harus didepositokan saat ini? dianggap bahwa tingkat bunga tidak berubah selama 25 tahun yaitu sebesar 8% per/tahun. Penyelesaian : Untuk menyelesaikan masalah ini akan digunakan logika stack yaitu : - pada tahun ke-25 jumlah uang = Rp. 1.000.000,- - pada tahun ke-24 jumlah uang = Rp. 1.000.000 / (1 + 0.8) - pada tahun ke-23 jumlah uang = . dst
Polish Notation Ada 3: Infix : operand operator operand Prefix : operator operand operand Postfix : operand operand operator Contoh Operasi Infix Prefix Postfix A + B +AB AB+ A+B-C ((A + B) – C) -+ABC AB+C-
Konversi Infix : 2 * 3 ^ 4 + 1 – 5 Prefix : 2 * (^34) + 1 – 5 (*2^34) + 1 – 5 (+*2^341) – 5 – + * 2 ^ 3 4 1 5 Postfix : 2 * (34^) + 1 – 5 (234^*) + 1 – 5 (234^*1+) – 5 2 3 4 ^ * 1 + 5 –
Postfix Postfix: operan di push dulu, jika ketemu operator, baru di pop, hasilnya dipush lagi, dst.
Kalkulasi PostFix dengan Stack Contoh : 234^*1+5- 2 3 4 2 81 162 1 163 5 158 Push 2,3,4 Push ^ Pop 4,3 Calculate 3^4 = 81 Push 81 Push * Pop 81,2 Calculate 2*81 Push 162 Push 1 Push + Pop 1,162 Calculate 162+1 Push 163 Push 5 Push - Pop 5,163 Calculate 163-5 Push 158
Prefix Kalo Prefix : operator di push dulu, jika ketemu dua operand berjejer, baru di pop, hasilnya dipush lagi, dst.
Kalkulasi Prefix Misal diberikan: Infix : 2^3 / 6 – 1 Prefix : -/^2361 Ketemu operator di-push Ketemu 2 operand berurutan pop 2 operand, 1 operator, lalu hitung hasilnya 3 - / 8 6 2 ^ 1 / 8/6 - - 2/6 Push -,/,^,2,3 Pop 3,2, ^ Calc: 2^3 = 8 Push 8,6 Pop 6,8,/ Calc: 8/6 Push 8/6, 1 Pop 1, 8/6, - Calc: 8/6 – 1
Latihan Latihan: buat notasi prefix & postfixnya hitung hasilnya bila: A + B * C * D – E A + (B – C) * D ^ E A ^ B + C ^ D * E buat notasi prefix & postfixnya hitung hasilnya bila: A = 5, B = 2, C = 1, D =4, E = 4.
Jawaban Prefix 1. -+A**BCDE 2. +A*–BC^DE 3. +^AB*^CDE Postfix
Jawaban Hasil : 1. 5 + 2 * 1 * 4 – 4 = 9 2. 5 + (2 – 1) * 4 ^ 4 = 5 + 1 * 16 = 21 3. 5 ^ 2 + 1 ^ 4 * 4 = 25 + 4 * 4 = 25 + 16 = 41
MAPPING KE STORAGE DARI STACK Bentuk mapping ke storage dari stack yang paling sederhana adalah dengan menggunakan pendekatan array satu dimensi. Hal ini karena sarana yang digunakan untuk menyatakan suatu stack adalah array. Jika diberikan stack S dengan m elemen maka bentuk mappingnya seperti mapping array satu dimensi dengan m elemen.
Selanjutnya jika terdapat dua stack S1 dan S2 masing-masing dengan jumlah maksimum elemennya adalah M dan N, maka kedua stack ini dialokasikan dalam dengan bentuk sbb: Konsep mapping seperti diatas dianggap tidak efisien, terutama jika S1 dan S2 tidak penuh pada saat yang bersamaan.
Cara yang dianggap lebih baik adalah : Jika diketahui bahwa jumlah elemen S1 dan S2 tidak melebihi jumlah tertentu, misal N. NOEL(S1) + NOEL(S2) <= N Maka bentuk mapping yang digunakan adalah :
Latihan Latihan: 1. Diberikan polish notation sbb: c. /^+-*635215 i) Buat ke dalam bentuk 2 polish notation lainnya ii) konversi ke bentuk stack dengan algoritma prefix & hitung hasilnya iii) konversi ke bentuk stack dengan algoritma postfix & hitung hasilnya iv) Buat tree untuk masing-masing polish notation di atas
Tugas Kelompok Masing-masing kelompok maksimal 3 orang Buat Program STACK maxstack : 50 message (ada) : full/empty Bisa menginputkan sebuah polish notation