Anda di halaman 1dari 8

BAB IX

STRUKTUR DATA STACK

9.1. Pendahuluan
Struktur data Stack atau Tumpukan sering dijumpai dalam kehidupan sehari-hari,
yaitu berupa tumpukan koin, tumpukan buku dan sejenisnya (lihat gambar 9.1). Misalnya ada
sebuah tumpukan koin. Jika seseorang memerlukan koin maka dia akan mengambil koin yang
paling atas, akibatnya tumpukan koin akan berkurang. Dan sebaliknya jika seseorang
menambahkan koin ke tumpukan, maka koin tersebut akan diletakkan di atas tumpukan yang
sudah ada, dan tumpukan koin bertambah tinggi.

Gambar 9.1 Tumpukan

Dengan melihat perilaku tumpukan seperti di atas, maka struktur data Stack dapat
didefinisikan sebagai struktur data List yang mempunyai karakteristik khusus, yaitu
penambahan dan penghapusan elemen hanya dapat dilakukan di satu ujung, yang disebut Top
of Stack (lihat gambar 9.2). Penambahan elemen mengakibatkan Stack bertambah panjang dan
sebaliknya penghapusan elemen mengakibatkan Stack menjadi lebih pendek. Dengan
karakteristik ini, Struktur data Stack mempunyai sifat Last In First Out (LIFO), yaitu elemen
yang terakhir masuk ke Stack adalah elemen yang paling dulu keluar dari Stack.

Top of Stack

Bottom of Stack
Gambar 9.2 Ilustrasi struktur data Stack

BAB IX : STRUKTUR DATA STACK - 143


Algoritma dan Pemrograman II

Dalam sistem komputer, struktur data Stack digunakan untuk menyimpan alamat
statement ketika memanggil fungsi sehingga ketika fungsi selesai dieksekusi maka program
akan kembali ke statement yang memanggil fungsi. Untuk jelasnya dapat dilihat pada gambar
call tree dari proses pemanggilan fungsi rekursif (gambar 1.1 sampai gambar 1.4).

9.2. Macam-macam Stack


Sama seperti struktur data List, struktur data Stack dapat diimplementasikan dengan
struktur data Array atau Linked List. Implementasi Stack dengan array akan membuat stack
menjadi statis (static Stack) karena sifat array yang terbatas menyebabkan ukuran Stack (size
of stack) menjadi terbatas juga. Sebaliknya, implementasi dengan Linked List membuat Stack
dinamik (dynamic Stack) yaitu ukuran stack dapat memanjang dan memendek sesuai
keperluan.

9.3. Operasi Stack


Operasi utama yang didefinisikan untuk Struktur data Stack adalah PUSH dan POP.
Operasi PUSH digunakan untuk memasukkan elemen ke top of stack dan operasi POP
digunakan untuk menghapus elemen yang berada pada top of stack. Operasi lainnya adalah:

1. IsEmpty: apakah stack kosong?


2. Top: elemen pada top of stack
3. InitStack: membuat stack baru yang kosong

Contoh operasi stack:


(a) InitStack(S); Top of Stack 3
(b) Push(S, 5); 6 6

(c) Push(S, 6); 5 5

(d) Push(S, 3); (a) (b) (c) (d)


(e) Pop(S);
9
(f) Push(S, 9); 6 6 6

(g) Pop(S) 5 5 5

(e) (f) (g)


Gambar 9.3 Contoh operasi Stack

BAB IX : STRUKTUR DATA STACK - 144


Algoritma dan Pemrograman II

9.4. Implementasi Stack dengan Array


Sama seperti struktur data List, struktur data Stack dapat diimplementasikan dengan
struktur data Array. Perlu dipertimbangkan banyaknya elemen stack ketika mendefinisikan
array sehingga tidak perlu terjadi kondisi stack penuh. Indeks 0 merupakan bottom of stack dan
indeks n merupakan top of stack (lihat gambar 9.4).

0 1 2 3 4 ........... maxIndex
Array S:
Top of Stack

Gambar 9.4 Implementasi Stack dengan Array

Untuk menanggulangi jika terjadi kondisi stack penuh, maka implementasi stack
dengan array, perlu ditambahkan suatu fungsi isFull untuk mencegah penambahan elemen ke
dalam stack yang sudah penuh. Fungsi-fungsi yang didefinisikan untuk struktur data stack:
1. Inisialisasi Stack(n): membuat array linier yang kosong untuk stack
n = 100 [Diasumsikan banyaknya elemen stack = 100]
integer Stack[n] [Diasumsikan elemen stack bertipe integer]
Tos = 0

2. Fungsi isEmpty(): apakah stack kosong?


Fungsi isEmpty()
{
1. if (Tos == 0);
{ return (1)}
else
{ return (0) }
}

3. Void Fungsi Push(S,x): Memasukkan elemen x ke stack


Void Fungsi Push(S, x)
{
1. if (Tos == n-1)
{ return (“Stack penuh, operasi tidak dapat dilakukan”)}
Else
{ S[Tos] = x
Size = Size+1
Tos = Tos+1 }
}

4. Fungsi Pop(S): menghapus elemen dari stack


Fungsi Pop(S)
{
1. If (Tos == 0)
{ return(“Stack kosong”)

BAB IX : STRUKTUR DATA STACK - 145


Algoritma dan Pemrograman II

Else
{ Tos = Tos-1
Temp = S[Tos]
Return(Temp) }
}

5. Fungsi Top(S): melihat elemen yang ada pada top of stack


Fungsi Top(S)
{
1. If (Tos == 0)
{ Return (“Stack kosong”)
2. Return (S[Tos-1])
}

9.5. Aplikasi Stack


Selain sebagai tempat penyimpan return address pada pemanggilan fungsi, struktur data
Stack dapat digunakan untuk memeriksa pasangan tanda kurung, mengkonveri ekspresi infix
menjadi suffix serta mengevaluasi ekspresi suffix

9.5.1. Memeriksa pasangan tanda kurung


Dalam suatu ekspresi aritmematika sering ditemui ekspresi yang ditulis diantara
sepasang tanda kurung, kurung buka dan kurung tutup. Ada 3 pasang tanda kurung yang biasa
digunakan yaitu:
1. ( dan )
2. { dan }
3. [ dan ]

Pada ekspresi aritmetika yang cukup kompleks dengan beberapa pasang tanda kurung
kadang membuat penulis lupa atau salah menuliskan pasangan tanda kurung. Untuk memeriksa
apakah ekspresi aritmetika mempunyai pasangan tanda kurung yang sesuai maka ekspresi
aritmetika tersebut dibaca (scan) mulai dari awal sampai akhir. Stack digunakan untuk
menyimpan (push) semua tanda kurung buka yang dibaca dan mengeluarkannya (pop) setiap
kali membaca tanda kurung tutup. Bandingkan tanda kurung buka yang keluar (pop) dari stack
dengan tanda kurung tutup yang ditemui. Jika kedua tanda kurung itu merupakan pasangan
maka sesuai. Jika bukan berupa pasangan, maka tidak sesuai, berarti ada kesalahan dalam
menuliskan tanda kurung tersebut.

BAB IX : STRUKTUR DATA STACK - 146


Algoritma dan Pemrograman II

Algoritma umum untuk memeriksa pasangan tanda kurung:


1. Buat Stack kosong
2. Baca simbol sampai akhir string:
a. Jika simbol berupa kurung buka, push simbol ke stack
b. Jika simbol berupa kurung tutup:
i. Periksa simbol pada Top of Stack:
A. jika simbol berupa pasangan dari kurung tutup, Pop Stack dan lanjutkan
pembacaan
B. jika simbol bukan berupa pasangannya, tampilkan error message
C. Jika stack kosong, tampilkan error message
3. Jika stack tidak kosong maka tampilkan error message.

Sebagai contoh diketahui ekspresi seperti berikut:


[a + ( b – { c / [( d + e) * f] * g} / {h ^ (i ^ j)}]
Periksalah pasangan tanda kurung pada ekspresi di atas dengan menggunakan stack.

9.5.2. Membuat ekspresi infix menjadi postfix


Ekspresi aritmetika yang biasa dikenal, ditulis dengan cara infix yaitu operator berada
di antara 2 operan atau L O R yang berarti, Left operand, Operator dan Right operand. Ekspresi
infix akan dikerjakan mulai dari kiri ke kanan. Yang menjadi masalah adalah jika ada bagian
ekspresi yang harus dikerjakan lebih dulu tetapi berada di sebelah kanan. Dalam hal ini bagian
ekspresi tersebut perlu ditulis di antara sepasang tanda kurung. Jika ada beberapa ekspresi yang
berada di antara tanda kurung, maka yang dikerjakan adalah ekspresi yang berada pada tanda
kurung yang paling dalam. Sebagai contoh, lihat ekspresi berikut ini:
X = (-b + (b^2 – (4 * a) * c) ^ (½))/(2 * a)

Seperti telah dijelaskan sebelumnya, penggunaan banyak tanda kurung dapat menjadi
sumber kesalahan dalam penulisan ekspresi. Untuk mengatasi masalah ini, seorang
matematikawan dari Polandia, Jan Lukaseiwicz, menemukan metoda penulisan ekspresi yang
disebut sebagai Reverse Polish Notation atau postfix yang tidak menggunakan tanda kurung.
Caranya dengan menuliskan operator setelah kedua operan, atau L R O yaitu Left operand,
Right operand, Operator. Sebagai contoh penulisan postfix dan padanan infix-nya dapat dilihat
pada tabel 9.1 di halaman berikut.

BAB IX : STRUKTUR DATA STACK - 147


Algoritma dan Pemrograman II

Tabel 9.1 Ekspresi Infix dan Postfix


Infix Postfix
A+B AB+
A*B+C AB*C+
A * (B + C) ABC+*
(A + B) / (C* (D – E)) AB+CDE-*/
(A ^ 2 + B^ 2) * (C – D) A2^B2^+CD-*

Untuk mengubah ekspresi infix menjadi postfix, digunakan struktur data stack sebagai
tempat penyimpan sementara. Algoritma umum untuk mengubah Infix menjadi Postfix:
1. Buat stack kosong
2. Baca simbol sampai akhir ekspresi.
3. Jika simbol berupa:
a. Operan: langsung tuliskan sebagai output
b. Kurung buka: push ke stack
c. Kurung tutup: pop stack sampai ketemu kurung buka (tanda kurung tidak ditulis sebagai
outpush)
d. Operator yang derajatnya lebih rendah dari TOP of Stack: pop stack sampai ketemu
operator yang derajatnya lebih rendah, lalu push ke stack:
e. Operator yang derajatnya lebih tinggi dari Top of Stack: push ke stack
f. Akhir simbol: pop stack sampai stack kosong.

9.5.3. Mengevaluasi ekspresi postfix


Untuk mengevaluasi sebuah ekspresi postfix atau untuk mengubah ekspresi postfix
menjadi infix, diperlukan struktur data stack juga. Algoritma umum untuk mengevaluasi
postfix adalah:
1. Buat stack kosong
2. Baca simbol sampai akhir ekspresi
3. Jika ekspresi berupa:
a. Operan, maka push ke stack
b. Operator, maka

BAB IX : STRUKTUR DATA STACK - 148


Algoritma dan Pemrograman II

i. R = pop(stack); L = pop(stack)
ii. lakukan operasi, push hasilnya ke stack
4. Hasil ekspresi = pop Stack.
5. Jika stack tidak kosong, tampilkan error message.

Sebagai latihan, evaluasi ekspresi postfix pada tabel 8.1 di atas jika diketahui:
A = 1, B = 2, C= 3. D = 4, dan E = -2.

Latihan Soal Bab 9


Untuk soal-soal berikut ini, gambarlah isi stack setiap operasi.
1. a. - buat stack kosong: S
- push (S, 5)
- push (S, 8)
- push (S, 2)
- pop()
- push (S, 9)
- push (S, 3)
- push (S, 6)
- pop()
- push (S, 2)
- push (S, 7)
- push (S, 1)
- pop()

b. - buat stack kosong: S


- push (S, 3)
- push (S, 7)
- pop()
- push (S, 9)
- push (S, 3)
- push (S, 2)
- pop()
- pop()
- pop()
- push (S, 6)
- push (S, 7)
- push (S, 1)

2. Buat notasi Infix – Postfix untuk persamaan berikut ini, gambarkan prosesnya dengan stack.
a. (a + b * (c / (d- e))) + f / g
b. (a + B – c) * ( d – e/ (f + g))
c. a – b * (c+d)/ (e –f) + g
d. a * (b – c) + d ^ e / f * g

3. Evaluasi persamaan postfix pada no 2, jika diketahui:


a = 1, b= -3, c = 2, d = -2, e = -1, f = 3, g = 4
Gambarkan prosesnya dengan stack

BAB IX : STRUKTUR DATA STACK - 149


Algoritma dan Pemrograman II

BAB IX : STRUKTUR DATA STACK - 150

Anda mungkin juga menyukai