STACK (TUMPUKAN)
Stack merupakan salah satu spesial linked list, yang mempunyai karakteristik
sebagai berikut :
1. Operasi penyisipan (inserting) dan penghapusan (deleting) hanya dapat dilakukan
pada elemen PUNCAK (TOP STACK), sehingga elemen yang pertama masuk
akan menjadi elemen terakhir yang dikeluarkan dari stack (First In Last Out
/FILO), atau sebaliknya elemen yang terakhir masuk akan menjadi elemen
pertama yang dikeluarkan dari stack (Last In First Out / LIFO).
2. Hanya terdapat 2 (dua) operasi pada STACK, yaitu penyisipan/inserting (PUSH)
dan penghapusan/Pengambilan/Deleting (POP).
Re pre se nt a si St a c k Pa da List Be rk a it
Bila data yang disisipkan (PUSH) ke stack berturut-turut adalah Kadir, Tarsan, Eko,
Basuki, dan Gogon, maka representasi data di memori adalah sebagai berikut :
Model Logika
Gogon Basuki Eko Tarsan Kadir TOP
Operasi Dasar Pada Stack
a. Operasi Inserting (PUSH)
Algoritma operasi inserting / PUSH
PUSH(TOP, X)
b.Operasi Deleting (POP)
Algoritma operasi Deleting / POP
APLIKASI STACK
1. Pemanggilan Sub Program
Ketika dijumpai instruksi RETURN, komputer harus mengetahui alamat instruksi
mana yang harus dilaksanakan berikutnya. Untuk mengetahui alamat instruksi
yang harus dilaksanakan berikutnya, pada saat ditemukan perintah CALL (sub
program: procedure atau function) komputer akan menyimpan alamat instruksi
setelah CALL sebagai elemen TOP stack, dan ketika ditemukan instruksi
RETURN, maka komputer akan mengambil elemen TOP dari stack sebagai
alamat instruksi yang harus dikerjakan berikutnya, dan harga tersebut dihapus dari
stack.
2. Mengavakuasi Ekspresi Aritmatika
Cara kita menuliskan ekspresi aritmatik adalah dalam notasi INFIX yaitu notasi
yang meletakkan OPERATOR diantara dua OPERAND. Kompiler akan mengubah
notasi tersebut ke dalam notasi POSTFIX yaitu notasi yang meletakkan OPERATOR
setelah OPERAND.
Contoh :
Notasi Infix : A + B * C Notasi Postfix : ABC * +
Keunggulan notasi POSTFIX adalah:
a) tidak diperlukan tanda kurung ( )
b) prioritas OPERATOR tidak lagi penting
c) proses penghitungan dapat diselesaikan dalam sekali scan/pembacaan dari kiri
ke kanan.
Cara mengeksekusi notasi aritmatik (notasi POSTFIX) adalah: notasi dibaca dari
kiri ke kanan, jika ditemukan OPERAND, disimpan ke dalam STACK. Jika
ditemukan OPERATOR, kompiler akan mengoperasikan OPERATOR tersebut
dengan mengambil dua OPERAND dari stack dan hasilnya akan disimpan kembali ke
3. Mengubah Notasi Infix Menjadi Postfix
Algoritma mengubah notasi INFIX ke Notasi POSTFIX 1. Baca ekspresi infix (E)
2. Tentukan panjang E, misalkan N
3. Tentukan derajat masing operator operator
Contoh : * dan / = 2, + dan - = 1, kurung buka ‘ ( ‘ = 0 4. Untuk I = 1 s/d N kerjakan
a. X = E[I] b.Jika X adalah:
Operand : Langsung tuliskan sebagai output ‘(‘ : PUSH ke STACK
‘)’ : POP dan tulis (ke output) semua isi STACK sampai ‘(‘ pasangannya. Tanda ‘(‘ juga diPOP tetapi tidak ditulis ke output
Operator : Jika stack kosong atau derajat X lebih tinggi dari elemen top stack, PUSH X ke stack.
Jika tidak, POP top stack dan tulis ke output
kemudian lakukan pembandingan X dengan top stack yang baru. Jika memenuhi syarat PUSH X ke stack. 5. Jika akhir ekspresi telah tercapai dan stack belum kosong, POP isi stack dan
tulis hasilnya.
Contoh Kasus
Ubah notasi INFIX berikut ke dalam notasi POSTFIX
E = A + B * C
Step Simbol Stack Output
0 # # #
1 A # A
2 + + A
3 B + A B
4 * + * A B
5 C + * A B C
6 ↵ # A B C * +
Notasi POSTFIX-nya adalah ABC*+
Latihan:
Ubah notasi INFIX berikut ke dalam notasi POSTFIX
4. Reversing String (Membalik Urutan String)
Untuk membalik urutan string dapat dilakukan dengan membaca
masing-masing karakter mulai karakter pertama sampai karakter terakhir dan memasukkanya
ke stack (PUSH ke stack). Setelah semua karakter masuk, keluarkan (POP) semua isi
stack dan cetak hasilnya.
Algoritma Reversing String
Reversing(StringAwal, StringHasil) Panjang = Length(StringAwal);
I = 1; StringHasil = ‘’; While I <= Panjang do
X = StringAwal[I]; PUSH(TOP, X);
StringHasil = StringHasil + X; I++;
Ewhile {
Jika ingin menampilkan hasilnya
Cout << ‘String awal adalah : ‘ << StringAwal; Cout << ‘String hasil adalah : ‘ << StringHasil; }
Return
5. Konversi Bilangan
Konversi bilangan desimal dapat dilakukan dengan membagi bilangan tersebut
dengan DIV basis bilangan yang diinginkan, dan memasukkan sisa baginya ke stack.
Jika bilangan asal sudah sama dengan 0 (nol), keluarkan isi stack dan tulis hasilnya.
Contoh kasus: konversi bilangan desimal ke biner
13(10) = ……..(2)
Cara menghitung
Step Proses Hasil Sisa 1 13 DIV 2 6 1 2 6 DIV 2 3 0 3 3 DIV 2 1 1 4 1 DIV 2 0 1