Data Structures
Week ke - 4
LO1: Explain the concept data structure and its usage in Computer Science
OUTLINE MATERI :
1. Stack
3. Queue
4. Circular Queue
5. Priority Queue
ISI MATERI
1. Stack
Stack adalah struktur data penting yang menyimpan elemen-elemennya secara teratur.
Kami akan menjelaskan konsep stack menggunakan analogi. Anda pasti pernah melihat
tumpukan piring di mana satu piring diletakkan di atas yang lain seperti yang ditunjukkan
pada Gambar 1. Sekarang, ketika Anda ingin melepas piring, Anda melepas piring paling
atas terlebih dahulu. Oleh karena itu, Anda dapat menambah dan menghapus elemen
(yaitu, pelat) hanya pada/dari satu posisi yang merupakan posisi paling atas.
Stack adalah struktur data linier yang menggunakan prinsip yang sama, yaitu elemen
dalam tumpukan ditambahkan dan dihapus hanya dari satu ujung, yang disebut TOP.
Oleh karena itu, stack disebut struktur data LIFO (Last-In-First-Out), karena elemen yang
dimasukkan terakhir adalah yang pertama kali dikeluarkan.
Stack dapat diimplementasikan dengan menggunakan array atau linked list. Pada bagian
ini, kita akan melihat bagaimana stack diimplementasikan menggunakan masing-masing
struktur data ini.
Dalam memori komputer, stack dapat direpresentasikan sebagai array linier. Setiap stack
memiliki variabel yang disebut TOP yang terkait dengannya, yang digunakan untuk
menyimpan alamat elemen paling atas dari stack. Ini adalah posisi di mana elemen akan
ditambahkan atau dihapus. Ada variabel lain yang disebut MAX, yang digunakan untuk
menyimpan jumlah maksimum elemen yang dapat ditampung oleh stack.
Data Structures
Jika TOP = NULL, maka menunjukkan bahwa stack kosong dan jika TOP = MAX-1,
maka stack penuh. (Anda pasti bertanya-tanya mengapa kami menulis MAX-1. Karena
indeks array dimulai dari 0.) Perhatikan Gambar 2.
Gambar 2. Stack
Push Operation
Operasi push digunakan untuk memasukkan elemen ke dalam stack. Elemen baru
ditambahkan di posisi teratas stack. Namun, sebelum memasukkan nilai, pertama-tama
kita harus memeriksa apakah TOP=MAX-1, karena jika demikian, maka stack sudah
penuh dan tidak ada lagi penyisipan yang dapat dilakukan. Jika ada upaya untuk
memasukkan nilai ke dalam stack yang sudah penuh, pesan OVERFLOW akan dicetak
Gambar 3. Stack
Pop Operation
Operasi pop digunakan untuk menghapus elemen paling atas dari stack. Namun, sebelum
menghapus nilai, pertama-tama kita harus memeriksa apakah TOP=NULL karena jika
demikian, itu berarti stack kosong dan tidak ada lagi penghapusan yang dapat dilakukan.
Data Structures
Jika ada upaya untuk menghapus nilai dari stack yang sudah kosong, pesan
UNDERFLOW akan dicetak
Gambar 5. Stack
Peek Operation
Peek adalah operasi yang mengembalikan nilai elemen paling atas dari stack tanpa
menghapusnya dari stack. Algoritma untuk operasi Peek diberikan sebagai berikut:
Namun, operasi Peek pertama-tama memeriksa apakah stack kosong, yaitu, jika TOP =
NULL, maka pesan yang sesuai akan dicetak, jika tidak, nilainya akan dikembalikan.
Perhatikan stack yang diberikan pada Gambar 7.
Gambar 7. Stack
Kita telah melihat bagaimana stack dibuat menggunakan array. Teknik membuat stack ini
mudah, tetapi kekurangannya adalah array harus dideklarasikan memiliki ukuran tetap.
Jika stack sangat kecil atau ukuran maksimumnya diketahui sebelumnya, maka
implementasi array dari stack memberikan implementasi yang efisien. Tetapi jika ukuran
Data Structures
array tidak dapat ditentukan sebelumnya, maka alternatif lain, yaitu representasi linked
list, digunakan.
Persyaratan penyimpanan representasi linked list dari stack dengan n elemen adalah O(n),
dan persyaratan waktu tipikal untuk operasi adalah O(1).
Dalam linked stack, setiap simpul memiliki dua bagian—satu yang menyimpan data dan
yang lain menyimpan alamat simpul berikutnya. Pointer START dari linked list
digunakan sebagai TOP. Semua penyisipan dan penghapusan dilakukan pada node yang
ditunjuk oleh TOP. Jika TOP = NULL, maka itu menunjukkan bahwa stack kosong.
Representasi linked list dari stack ditunjukkan pada Gambar 8.
Push operation
Operasi push digunakan untuk memasukkan elemen ke dalam stack. Elemen baru
ditambahkan di posisi teratas stack. Pertimbangkan stack terkait yang ditunjukkan pada
Gambar 9 dan 10.
Data Structures
Pop Operation
Operasi pop digunakan untuk menghapus elemen paling atas dari stack. Namun, sebelum
menghapus nilai, pertama-tama kita harus memeriksa apakah TOP=NULL, karena jika
demikian, berarti stack kosong dan tidak ada lagi penghapusan yang dapat dilakukan. Jika
upaya dilakukan untuk menghapus nilai dari stack yang sudah kosong, pesan
UNDERFLOW akan dicetak. Perhatikan stack yang ditunjukkan pada Gambar 11 dan 12.
Notasi infiks, postfiks, dan prefiks adalah tiga notasi yang berbeda tetapi setara dalam
menulis ekspresi aljabar. Namun sebelum mempelajari tentang notasi prefiks dan
postfiks, mari kita lihat dulu apa itu notasi infiks. Kita semua akrab dengan notasi infiks
penulisan ekspresi aljabar. Saat menulis ekspresi aritmatika menggunakan notasi infiks,
operator ditempatkan di antara operan. Misalnya, A+B; di sini, operator plus ditempatkan
di antara dua operan A dan B. Meskipun mudah bagi kita untuk menulis ekspresi
menggunakan notasi infiks, komputer merasa sulit untuk menguraikan karena komputer
membutuhkan banyak informasi untuk mengevaluasi ekspresi. Informasi diperlukan
tentang prioritas operator dan aturan asosiatif, dan tanda kurung yang mengesampingkan
Data Structures
aturan ini. Jadi, komputer bekerja lebih efisien dengan ekspresi yang ditulis
menggunakan notasi prefiks dan postfiks.
Notasi Postfix dikembangkan oleh Jan Lukasiewicz yang adalah seorang ahli logika,
matematika, dan filsuf Polandia. Tujuannya adalah untuk mengembangkan notasi prefiks
bebas kurung (juga dikenal sebagai notasi Polandia) dan notasi postfix, yang lebih
dikenal sebagai Notasi Polandia Terbalik atau RPN.
Dalam notasi postfix, seperti namanya, operator ditempatkan setelah operan. Misalnya,
jika sebuah ekspresi ditulis sebagai A+B dalam notasi infiks, ekspresi yang sama dapat
ditulis sebagai AB+ dalam notasi postfix. Urutan evaluasi ekspresi postfix selalu dari kiri
ke kanan. Tanda kurung genap tidak dapat mengubah urutan evaluasi.
Operasi postfix bahkan tidak mengikuti aturan prioritas operator. Operator yang muncul
pertama kali dalam ekspresi dioperasikan terlebih dahulu pada operan. Misalnya, diberi
notasi postfix AB+C*. Sedangkan evaluasi, penjumlahan akan dilakukan sebelum
perkalian.
Jadi kita melihat bahwa dalam notasi postfix, operator diterapkan pada operan yang
langsung diserahkan kepada mereka. Pada contoh, AB+C*, + diterapkan pada A dan B,
kemudian * diterapkan pada hasil penjumlahan dan C.
Meskipun notasi prefiks juga dievaluasi dari kiri ke kanan, satu-satunya perbedaan antara
notasi postfix dan notasi prefiks adalah bahwa dalam notasi prefiks, operator ditempatkan
Data Structures
sebelum operan. Misalnya, jika A+B adalah ekspresi dalam notasi infiks, maka ekspresi
yang sesuai dalam notasi prefiks diberikan oleh +AB.
Saat mengevaluasi ekspresi prefiks, operator diterapkan ke operan yang ada segera di
sebelah kanan operator. Seperti postfix, ekspresi prefiks juga tidak mengikuti aturan
prioritas operator dan asosiatif, dan bahkan tanda kurung tidak dapat mengubah urutan
evaluasi.
3. Queue
• Orang-orang bergerak di eskalator. Orang yang naik eskalator pertama akan menjadi
orang pertama yang turun dari eskalator.
• Orang-orang menunggu bus. Orang pertama yang berdiri di antrean akan menjadi
orang pertama yang masuk ke dalam bus.
• Orang-orang berdiri di luar jendela penjualan tiket gedung bioskop. Orang pertama
dalam antrean akan mendapatkan tiket terlebih dahulu dan dengan demikian akan
menjadi orang pertama yang keluar darinya.
Semua contoh diatas, kita melihat bahwa elemen pada posisi pertama dilayani terlebih
dahulu. Sama halnya dengan struktur data queue. Queue adalah struktur data FIFO (First-
In, First-Out) di mana elemen yang dimasukkan terlebih dahulu adalah yang pertama kali
dikeluarkan. Elemen-elemen dalam queue ditambahkan di satu ujung yang disebut REAR
dan dihapus dari ujung lainnya yang disebut FRONT.
Data Structures
Queue dapat diimplementasikan dengan menggunakan array atau linked list. Pada bagian
ini, kita akan melihat bagaimana queue diimplementasikan menggunakan masing-masing
struktur data ini.
Insert Operation
Pada Gambar 13, FRONT = 0 dan REAR = 5. Misalkan kita ingin menambahkan elemen
lain dengan nilai 45, maka REAR akan bertambah 1 dan nilainya akan disimpan pada
posisi yang ditunjukkan oleh REAR. Queue setelah penambahan akan seperti yang
ditunjukkan pada Gambar 14. Di sini, FRONT = 0 dan REAR = 6. Setiap kali elemen baru
harus ditambahkan, kita mengulanginya prosedur yang sama.
Data Structures
Delete Operation
Jika kita ingin menghapus sebuah elemen dari antrian, maka nilai FRONT akan
bertambah. Penghapusan dilakukan hanya dari ujung queue ini. Queue setelah
penghapusan akan seperti yang ditunjukkan pada Gambar 15. Di sini, FRONT = 1
dan REAR = 6.
Dalam linked queue, setiap elemen memiliki dua bagian, satu yang menyimpan
data dan yang lain menyimpan alamat elemen berikutnya. Pointer START dari
linked list digunakan sebagai FRONT. Di sini, kita juga akan menggunakan
pointer lain yang disebut REAR, yang akan menyimpan alamat elemen terakhir
dalam queue. Semua penyisipan akan dilakukan di bagian belakang dan semua
penghapusan akan dilakukan di bagian depan. Jika FRONT = REAR = NULL,
maka itu menandakan queue kosong.
Insert operation
Data Structures
Gambar 17. Linked queue
Delete operation
Data Structures
4. Circular Queue
Dalam linear queue, telah membahas sejauh ini bahwa penyisipan hanya dapat dilakukan
pada satu ujung yang disebut REAR dan penghapusan selalu dilakukan dari ujung lainnya
yang disebut FRONT. Perhatikan queue yang ditunjukkan pada Gambar 21.
Dalam circular queue, indeks pertama muncul tepat setelah indeks terakhir. Secara
konseptual, Anda dapat memikirkan circular queue seperti yang ditunjukkan pada
Gambar 22.
Circular queue akan penuh hanya jika FRONT = 0 dan REAR = Maks – 1. Circular
queue diimplementasikan dengan cara yang sama seperti mengimplementasikan linear
queue. Satu-satunya perbedaan adalah pada code yang melakukan operasi penyisipan dan
penghapusan.
Data Structures
Algoritma penghapusan pada circular queue
Step 1: IF FRONT = -1
Write “UNDERFLOW”
Goto Step 4
[END of IF]
Step 2: SET VAL = QUEUE[FRONT]
Step 3: IF FRONT = REAR
SET FRONT = REAR = -1
ELSE
IF FRONT = MAX -1
SET FRONT = 0
ELSE
SET FRONT = FRONT + 1
[END of IF]
[END OF IF]
Step 4: EXIT
5. Priority Queue
Priority queue adalah struktur data di mana setiap elemen diberi prioritas. Prioritas
elemen akan digunakan untuk menentukan urutan elemen yang akan diproses. Aturan
umum pemrosesan elemen queue prioritas adalah elemen dengan prioritas lebih tinggi
diproses sebelum elemen dengan prioritas lebih rendah. Dua elemen dengan prioritas
yang sama diproses berdasarkan first-come-first-served (FCFS). Ada dua cara untuk
mengimplementasikan priority queue, yaitu linked list dan array.
Ketika priority queue diimplementasikan dengan menggunakan linked list, maka setiap
node dari list akan memiliki tiga bagian: (a) bagian informasi atau data, (b) nomor
prioritas elemen, dan (c) alamat node berikutnya. Jika kita menggunakan linked list yang
diurutkan, maka elemen dengan prioritas lebih tinggi akan mendahului elemen dengan
prioritas lebih rendah.
Insertion Ketika elemen baru harus dimasukkan dalam priority queue, kita harus
melintasi seluruh daftar sampai kita menemukan simpul yang memiliki prioritas lebih
rendah dari elemen baru. Node baru disisipkan sebelum node dengan prioritas lebih
rendah. Namun, jika ada elemen yang memiliki prioritas yang sama dengan elemen baru,
elemen baru dimasukkan setelah elemen tersebut. Sebagai contoh, perhatikan priority
queue yang ditunjukkan pada Gambar 23.
Data Structures
Gambar 23. Priority queue
Jika kita memiliki elemen baru dengan data = F dan nomor prioritas = 2, maka elemen
tersebut akan disisipkan setelah B, karena kedua elemen ini memiliki prioritas yang sama
tetapi penyisipan dilakukan berdasarkan FCFS seperti yang ditunjukkan pada Gambar 24.
Deletion Penghapusan adalah proses yang sangat sederhana dalam kasus ini. Node
pertama dari daftar akan dihapus dan data dari node tersebut akan diproses terlebih
dahulu.
Data Structures
SIMPULAN
Dalam kehidupan sehari-hari queue dikenal sebagai “first come, first serve”. Dalam
programming, konsep queue dikenal sebagai first in first out atau FIFO
Sedangkan konsep stack seperti sebuah deck kartu dapat ditempatkan menjadi sebuh stack dalam
meja. Tetapi untuk membagikan kartu, kartu hanya dapat dibagikan dari satu deck satu per satu.
Tidak seperti queue, kartu pertama yang disimpan ke dalam stack adalah kartu terakhir yang
dapat digunakan. Hal ini dikenal sebagai konsep first in last out atau FILO (juga dikenal sebagai
LIFO atau last in first out)
• Perbedaan utama antara stack dan queue adalah stack menggunakan konsep LIFO (Last in
First Out) sedangkan queue menggunakan konsep FIFO (First in First Out)
• Item hanya dapat ditambahkan atau dihapus hanya pada satu sisi (TOP) dalam sebuah
stack, sedangkan dalam queue penambahan data dilakukan pada sisi REAR dan
penghapusan dilakukan pada sisi FRONT
• Operasi dasar pada stack dan queue disebut ‘PUSH dan ‘POP’
Data Structures
DAFTAR PUSTAKA
Data Structures