Document - IKK112111 - STMIK EL RAHMA chapt 04 Stack
STRUKTUR DATA
Chapt 04 : Stack
Oleh : Yuli Praptomo PHS, S.Kom
STACK
Stack
adalah suatu tumpukan dari benda.
Stack adalah suatu kumpulan data yang seolaholah ada data yang diletakkan di atas data lain.
Satu hal yang perlu diingat adalah bahwa kita
bisa menambahkan (menyisipkan) data,
mengambil (menghapus) data lewat ujung yang
sama, yang disebut sebagai ujung atas
tumpukan (top of stack).
Konsep utamanya adalah LIFO (Last In First
Out), benda yang terakhir masuk dalam stack
akan menjadi benda pertama yang dikeluarkan
dari stack.
Keadaan mula-mula Setelah ditumpuk
adalah kosong
Pada
gambar di atas, jika kita ingin
mengambil sesuatu dari tumpukan maka
kita harus mengambil benda paling atas
dahulu, yakni compo.
Misalnya jika VCD langsung diambil,
compo akan jatuh.
Prinsip stack ini bisa diterapkan dalam
pemrograman. Di C++, ada dua cara
penerapan prinsip stack, yakni dengan
array dan linked list.
Setidaknya stack haruslah memiliki
operasi-operasi sebagai berikut :
Push
Untuk menambahkan item pada tumpukan paling atas
Pop
Untuk mengambil item teratas
Clear
Untuk mengosongkan stack
IsEmpty Untuk memeriksa apakah stack kosong
IsFull
Untuk memeriksa apakah stack sudah penuh
Retreive Untuk mendapatkan nilai dari item teratas
Stack dengan Array
Sesuai
dengan sifat stack, pengambilan /
penghapusan di elemen dalam stack
harus dimulai dari elemen teratas.
Operasi-operasi pada Stack
dengan Array
IsFull
Fungsi ini memeriksa apakah stack yang
ada sudah penuh.
Stack penuh jika puncak stack terdapat
tepat di bawah jumlah maksimum yang
dapat ditampung stack atau dengan kata
lain :
Top = MAX_STACK -1
Push
Fungsi ini menambahkan sebuah elemen
ke dalam stack dan tidak bisa dilakukan
lagi jika stack sudah penuh.
IsEmpty
Fungsi menentukan apakah stack kosong
atau tidak.
Tanda bahwa stack kosong adalah Top
bernilai kurang dari nol.
Pop
Fungsi ini mengambil elemen teratas dari stack
dengan syarat stack tidak boleh kosong.
Clear
Fungsi ini mengosongkan stack dengan cara
mengeset Top dengan -1.
Jika Top bernilai kurang dari nol maka stack
dianggap kosong.
Retreive
Fungsi ini untuk melihat nilai yang berada pada
posisi tumpukan teratas.
Contoh Program
Stack dengan Single Linked List
Selain
implementasi stack dengan array
seperti telah dijelasnkan sebelumnya, ada
cara lain untuk mengimplementasi stack
dalam C++, yakni dengan single linked
list.
Keunggulannya dibandingkan array tebtu
saja adalah penggunaan alokasi memori
yang dinamis sehingga menghindari
pemborosan memori.
Misalnya
saja pada stack dengan array
disediakan tempat untuk stack berisi 150
elemen, sementara ketika dipakai oleh user
stack hanya diisi 50 elemen, maka telah terjadi
pemborosan memori untuk sisa 100 elemen,
yang tak terpakai.
Dengan penggunaan linked list maka tempat
yang disediakan akan sesuai dengan banyaknya
elemen yang mengisi stack.
Oleh karena itu pula dalam stack dengan linked
list tidak ada istilah full, sebab biasanya
program tidak menentukan jumlah elemen stack
yang mungkin ada (kecuali jika sudah dibatasi
oleh pembuatnya).
Namun demikian sebenarnya stack ini pun
memiliki batas kapasitas, yakni dibatasi oleh
jumlah memori yang tersedia.
Contoh Program
PENULISAN UNGKAPAN
NUMERIS
Salah
satu pemanfaatan tumpukan adalah
untuk menulis ungkapan menggunakan
notasi tertentu.
Seperti kita ketahui, dalam penulisan
ungkapan, khususnya ungkapan numeris,
kita selalu menggunakan tanda kurung
untuk mengelompokkan bagian mana
yang harus dikerjakan lebih dahulu.
Sebagai
contoh, dalam ungkapan:
(A + B) * (C - D)
suku
(A + B ) akan dikerjakan lebih
dahulu, kemudian suku ( C - D ) , dan
terakhir mengalikan hasil yang diperoleh
dari dua suku ini.
Sedangkan
pada ungkapan:
A+B*C-D
maka B * C akan dikerjakan lebih dahulu,
diikuti yang lain.
Dalam hal ini pemakaian tanda kurung
akan sangat mempengaruhi hasil akhir.
Cara penulisan ungkapan sering disebut
dengan notasi infix, yang artinya adalah
bahwa operator ditulis di antara dua
operand.
Dalam
ungkapan-ungkapan yang rumit,
pemakaian tanda kurung ini tidak bisa
dihindari.
Semakin rumit suatu ungkapan semakin
banyak dibutuhkan tanda kurung.
Hal ini membawa suatu konsekuensi
bahwa penulisan tanda kurung itupun
harus benar-benar terhindar dari
kesalahan.
kemudian
dikembangkan satu cara
penulisan ungkapan numeris yang
selanjutnya disebut notasi Polish atau
notasi prefix, yang artinya adalah bahwa
operator ditulis sebelum kedua operand
yang akan disaji-kan.
Berikut
disajikan beberapa contoh notasi
prefix dari notasi infix (simbol $ adalah
simbol perpangkatan):
Infix
Prefix
A+B
+AB
A+ B- C
-+ A B C
(A + B) * (C - D)
*+AB-CD
A - B / (C * D $ E)
/- A B * C $ D E
Secara
sederhana, proses konversi dari
infix menjadi prefix dijelaskan sebagai
berikut. Misalnya ungkapan yang akan
dikonversi-kan adalah:
(A + B) * ( C - D)
Dengan menggunakan tanda kurung
bantuan, ungkapan di atas kita ubah
enjadi:
(+A B) * (- C D)
Jika
[- A B] kita misalkan P, dan [- C D) kita
misalkan Q, maka ungkapan di atas bisa ditulis
sebagai:
P*Q
Selanjutnya, notasi infix di atas kita ubah
menjadi notasi prefix
*PQ
Dengan mengembalikan P dan Q pada
notasinya semula dan menghapus tanda kurung
bantuan, kita peroleh notasi prefix dari
persamaan (A + B ) * (C - D ) , yaitu:
*+AB-CD
Notasi
lain, yang merupakan kebalikan
notasi prefix, adalah notasi postfix atau
notasi suffix, atau lebih dikenal dengan
notasi Polish Terbalik (Reverse Polish
Notation atau RPN).
Dalam hal ini operator ditulis sesudah
operand.
Sama halnya dengan notasi prefix, maka
dalam notasi postfix inipun tidak
diperlukan adanya tanda kurung
pengelompokan.
Proses
konversi dari notasi infix ke notasi
postfix juga sama dengan konversi dari
infix ke prefix. Sebagai contoh, ungkapan:
(A + B) * (C - D)
Dengan kurung bantuan kita peroleh:
[A B +] * [C D -]
Kemudian dengan memisalkan [ A B + ] sebagai P, dan [
C D - ] sebagai Q, dan kemudian dilakukan konversi dan
substitusi kembali, kita peroleh notasi postfix untuk
ungkapan di atas, yaitu:
AB+CD-*
Dalam hal inipun urutan penulisan operator juga
menentukan operasi mana yang harus dikerjakan lebih
dahulu. Pada halaman ber-ikut disajikan beberapa
contoh lain hasil konversi notasi infix menjadi postfix.
Infix
Postfix
A+B–C
AB+C–
(A+B)*(C–D)
AB+CD-*
A–B/(C*D$E)
AB -CDE$*/
Algoritma INFIX ke POSTFIX
Langkah 0
Baca ungkapan dalam notasi infix, misal S;
Tentukan panjang ungkapan tersebut, misalnya N
karakter;
Siapkan sebuah tumpukan kosong dan siapkan
derajad masing-masing operator,
$ berderajad 3,
/ dan * berderajad 2,
+ dan - berderajad 1,
( berderajad 0.
Langkah 1 Dimulai dari I = 1 sampai N kerjakan langkahlangkah berikut:
a. R = S[I]
b. Test nilai R. Jika R adalah:
operand : langsung ditulis.
kurung buka : push ke dalam tumpukan.
kurung tutup : pop dan tulis semua isi tumpukan
sampai ujung tumpukan ='('. Pop juga tanda '(' ini, tetapi
tidak usah ditulis.
operator
: jika tumpukan kosong, atau derajad R
lebih tinggi dibanding derajad ujung tumpukan, push
operator ke dalam tumpukan. Jika tidak, pop ujung tumpukan dan tulis; kemudian ulangi pembandingan R
dengan ujung tumpukan. Kemudian R di push. ( Catatan
:kurung buka di dalam tumpukan dianggap mempunyai
derajad yang lebih rendah dibanding R.)
Langkah 2 Jika akhir notasi infix telah
tercapai, dan tumpukan masih belum
kosong, pop semua isi tumpukan dan tulis
hasilnya.
( A + B ) / (( C – D ) * E $ F )
Proses
ke
Karakter
Dibaca
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(
A
+
B
)
/
(
(
C
D
)
*
E
$
F
)
Isi
Tumpukan
(
(
+(
/
/(
/((
/((
-/((
-/((
(/
*(/
*(/
$*(/
$*(/
*(/
(/
/
Karakter
Tercetak
Notasi Postfix
Yang Terbentuk
A
A
B
+
AB
AB+
C
AB+C
D
-
AB+CD
AB+CD-
E
AB+CD–E
F
$
*
AB+CD–EF
AB+CD–EF$
AB+CD–EF$*
/
AB+CD–EF$*/
Chapt 04 selesai . . .
Chapt 04 : Stack
Oleh : Yuli Praptomo PHS, S.Kom
STACK
Stack
adalah suatu tumpukan dari benda.
Stack adalah suatu kumpulan data yang seolaholah ada data yang diletakkan di atas data lain.
Satu hal yang perlu diingat adalah bahwa kita
bisa menambahkan (menyisipkan) data,
mengambil (menghapus) data lewat ujung yang
sama, yang disebut sebagai ujung atas
tumpukan (top of stack).
Konsep utamanya adalah LIFO (Last In First
Out), benda yang terakhir masuk dalam stack
akan menjadi benda pertama yang dikeluarkan
dari stack.
Keadaan mula-mula Setelah ditumpuk
adalah kosong
Pada
gambar di atas, jika kita ingin
mengambil sesuatu dari tumpukan maka
kita harus mengambil benda paling atas
dahulu, yakni compo.
Misalnya jika VCD langsung diambil,
compo akan jatuh.
Prinsip stack ini bisa diterapkan dalam
pemrograman. Di C++, ada dua cara
penerapan prinsip stack, yakni dengan
array dan linked list.
Setidaknya stack haruslah memiliki
operasi-operasi sebagai berikut :
Push
Untuk menambahkan item pada tumpukan paling atas
Pop
Untuk mengambil item teratas
Clear
Untuk mengosongkan stack
IsEmpty Untuk memeriksa apakah stack kosong
IsFull
Untuk memeriksa apakah stack sudah penuh
Retreive Untuk mendapatkan nilai dari item teratas
Stack dengan Array
Sesuai
dengan sifat stack, pengambilan /
penghapusan di elemen dalam stack
harus dimulai dari elemen teratas.
Operasi-operasi pada Stack
dengan Array
IsFull
Fungsi ini memeriksa apakah stack yang
ada sudah penuh.
Stack penuh jika puncak stack terdapat
tepat di bawah jumlah maksimum yang
dapat ditampung stack atau dengan kata
lain :
Top = MAX_STACK -1
Push
Fungsi ini menambahkan sebuah elemen
ke dalam stack dan tidak bisa dilakukan
lagi jika stack sudah penuh.
IsEmpty
Fungsi menentukan apakah stack kosong
atau tidak.
Tanda bahwa stack kosong adalah Top
bernilai kurang dari nol.
Pop
Fungsi ini mengambil elemen teratas dari stack
dengan syarat stack tidak boleh kosong.
Clear
Fungsi ini mengosongkan stack dengan cara
mengeset Top dengan -1.
Jika Top bernilai kurang dari nol maka stack
dianggap kosong.
Retreive
Fungsi ini untuk melihat nilai yang berada pada
posisi tumpukan teratas.
Contoh Program
Stack dengan Single Linked List
Selain
implementasi stack dengan array
seperti telah dijelasnkan sebelumnya, ada
cara lain untuk mengimplementasi stack
dalam C++, yakni dengan single linked
list.
Keunggulannya dibandingkan array tebtu
saja adalah penggunaan alokasi memori
yang dinamis sehingga menghindari
pemborosan memori.
Misalnya
saja pada stack dengan array
disediakan tempat untuk stack berisi 150
elemen, sementara ketika dipakai oleh user
stack hanya diisi 50 elemen, maka telah terjadi
pemborosan memori untuk sisa 100 elemen,
yang tak terpakai.
Dengan penggunaan linked list maka tempat
yang disediakan akan sesuai dengan banyaknya
elemen yang mengisi stack.
Oleh karena itu pula dalam stack dengan linked
list tidak ada istilah full, sebab biasanya
program tidak menentukan jumlah elemen stack
yang mungkin ada (kecuali jika sudah dibatasi
oleh pembuatnya).
Namun demikian sebenarnya stack ini pun
memiliki batas kapasitas, yakni dibatasi oleh
jumlah memori yang tersedia.
Contoh Program
PENULISAN UNGKAPAN
NUMERIS
Salah
satu pemanfaatan tumpukan adalah
untuk menulis ungkapan menggunakan
notasi tertentu.
Seperti kita ketahui, dalam penulisan
ungkapan, khususnya ungkapan numeris,
kita selalu menggunakan tanda kurung
untuk mengelompokkan bagian mana
yang harus dikerjakan lebih dahulu.
Sebagai
contoh, dalam ungkapan:
(A + B) * (C - D)
suku
(A + B ) akan dikerjakan lebih
dahulu, kemudian suku ( C - D ) , dan
terakhir mengalikan hasil yang diperoleh
dari dua suku ini.
Sedangkan
pada ungkapan:
A+B*C-D
maka B * C akan dikerjakan lebih dahulu,
diikuti yang lain.
Dalam hal ini pemakaian tanda kurung
akan sangat mempengaruhi hasil akhir.
Cara penulisan ungkapan sering disebut
dengan notasi infix, yang artinya adalah
bahwa operator ditulis di antara dua
operand.
Dalam
ungkapan-ungkapan yang rumit,
pemakaian tanda kurung ini tidak bisa
dihindari.
Semakin rumit suatu ungkapan semakin
banyak dibutuhkan tanda kurung.
Hal ini membawa suatu konsekuensi
bahwa penulisan tanda kurung itupun
harus benar-benar terhindar dari
kesalahan.
kemudian
dikembangkan satu cara
penulisan ungkapan numeris yang
selanjutnya disebut notasi Polish atau
notasi prefix, yang artinya adalah bahwa
operator ditulis sebelum kedua operand
yang akan disaji-kan.
Berikut
disajikan beberapa contoh notasi
prefix dari notasi infix (simbol $ adalah
simbol perpangkatan):
Infix
Prefix
A+B
+AB
A+ B- C
-+ A B C
(A + B) * (C - D)
*+AB-CD
A - B / (C * D $ E)
/- A B * C $ D E
Secara
sederhana, proses konversi dari
infix menjadi prefix dijelaskan sebagai
berikut. Misalnya ungkapan yang akan
dikonversi-kan adalah:
(A + B) * ( C - D)
Dengan menggunakan tanda kurung
bantuan, ungkapan di atas kita ubah
enjadi:
(+A B) * (- C D)
Jika
[- A B] kita misalkan P, dan [- C D) kita
misalkan Q, maka ungkapan di atas bisa ditulis
sebagai:
P*Q
Selanjutnya, notasi infix di atas kita ubah
menjadi notasi prefix
*PQ
Dengan mengembalikan P dan Q pada
notasinya semula dan menghapus tanda kurung
bantuan, kita peroleh notasi prefix dari
persamaan (A + B ) * (C - D ) , yaitu:
*+AB-CD
Notasi
lain, yang merupakan kebalikan
notasi prefix, adalah notasi postfix atau
notasi suffix, atau lebih dikenal dengan
notasi Polish Terbalik (Reverse Polish
Notation atau RPN).
Dalam hal ini operator ditulis sesudah
operand.
Sama halnya dengan notasi prefix, maka
dalam notasi postfix inipun tidak
diperlukan adanya tanda kurung
pengelompokan.
Proses
konversi dari notasi infix ke notasi
postfix juga sama dengan konversi dari
infix ke prefix. Sebagai contoh, ungkapan:
(A + B) * (C - D)
Dengan kurung bantuan kita peroleh:
[A B +] * [C D -]
Kemudian dengan memisalkan [ A B + ] sebagai P, dan [
C D - ] sebagai Q, dan kemudian dilakukan konversi dan
substitusi kembali, kita peroleh notasi postfix untuk
ungkapan di atas, yaitu:
AB+CD-*
Dalam hal inipun urutan penulisan operator juga
menentukan operasi mana yang harus dikerjakan lebih
dahulu. Pada halaman ber-ikut disajikan beberapa
contoh lain hasil konversi notasi infix menjadi postfix.
Infix
Postfix
A+B–C
AB+C–
(A+B)*(C–D)
AB+CD-*
A–B/(C*D$E)
AB -CDE$*/
Algoritma INFIX ke POSTFIX
Langkah 0
Baca ungkapan dalam notasi infix, misal S;
Tentukan panjang ungkapan tersebut, misalnya N
karakter;
Siapkan sebuah tumpukan kosong dan siapkan
derajad masing-masing operator,
$ berderajad 3,
/ dan * berderajad 2,
+ dan - berderajad 1,
( berderajad 0.
Langkah 1 Dimulai dari I = 1 sampai N kerjakan langkahlangkah berikut:
a. R = S[I]
b. Test nilai R. Jika R adalah:
operand : langsung ditulis.
kurung buka : push ke dalam tumpukan.
kurung tutup : pop dan tulis semua isi tumpukan
sampai ujung tumpukan ='('. Pop juga tanda '(' ini, tetapi
tidak usah ditulis.
operator
: jika tumpukan kosong, atau derajad R
lebih tinggi dibanding derajad ujung tumpukan, push
operator ke dalam tumpukan. Jika tidak, pop ujung tumpukan dan tulis; kemudian ulangi pembandingan R
dengan ujung tumpukan. Kemudian R di push. ( Catatan
:kurung buka di dalam tumpukan dianggap mempunyai
derajad yang lebih rendah dibanding R.)
Langkah 2 Jika akhir notasi infix telah
tercapai, dan tumpukan masih belum
kosong, pop semua isi tumpukan dan tulis
hasilnya.
( A + B ) / (( C – D ) * E $ F )
Proses
ke
Karakter
Dibaca
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(
A
+
B
)
/
(
(
C
D
)
*
E
$
F
)
Isi
Tumpukan
(
(
+(
/
/(
/((
/((
-/((
-/((
(/
*(/
*(/
$*(/
$*(/
*(/
(/
/
Karakter
Tercetak
Notasi Postfix
Yang Terbentuk
A
A
B
+
AB
AB+
C
AB+C
D
-
AB+CD
AB+CD-
E
AB+CD–E
F
$
*
AB+CD–EF
AB+CD–EF$
AB+CD–EF$*
/
AB+CD–EF$*/
Chapt 04 selesai . . .