Anda di halaman 1dari 17

LECTURE NOTES

Data Structures
Week ke - 4

Stack and Queue


LEARNING OUTCOMES

LO1: Explain the concept data structure and its usage in Computer Science

OUTLINE MATERI :

1. Stack

2. Infix, Postfix, and Prefix Notation

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.

Gambar 1. Stack of plate

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.

1.1. Array Representation

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

Gambar 4. Stack after insertion

Algoritma penyisipan elemen pada stack


Step 1: IF TOP = MAX-1
PRINT OVERFLOW
Goto Step 4
[END OF IF]
Step 2: SET TOP = TOP + 1
Step 3: SET STACK[TOP] = VALUE
Step 4: END

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

Gambar 6. Stack after deletion

Algoritma penghapusan elemen pada stack


Step 1: IF TOP = NULL
PRINT UNDERFLOW
Goto Step 4
[END OF IF]
Step 2: SET VAL = STACK[TOP]
Step 3: SET TOP = TOP - 1
Step 4: END

Peek Operation

Peek adalah operasi yang mengembalikan nilai elemen paling atas dari stack tanpa
menghapusnya dari stack. Algoritma untuk operasi Peek diberikan sebagai berikut:

Step 1: IF TOP = NULL


PRINT STACK IS EMPTY
Goto Step 3
Step 2: RETURN STACK[TOP]
Step 3: END

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

1.2. Linked Representation

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.

Gambar 8. Linked Stack

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.

Gambar 9. Linked Stack

Gambar 10. Linked Stack after inserting a new node

Algoritma penyisipan elemen pada linked Stack


Step 1: Allocate memory for the new node and name it as NEW_NODE
Step 2: SET NEW_NODE -> DATA = VAL
Step 3: IF TOP = NULL
SET NEW_NODE -> NEXT = NULL
SET TOP = NEW_NODE
ELSE
SET NEW_NODE -> NEXT = TOP
SET TOP = NEW_NODE
[END OF IF]
Step 4: END

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.

Gambar 11. Linked Stack

Gambar 12. Linked Stack after deletion of the topmost element

Algoritma penghapusan elemen pada linked stack


Step 1: IF TOP = NULL
PRINT “UNDERFLOW”
Goto Step 5
[END OF IF]
Step 2: SET PTR = TOP
Step 3: SET TOP = TOP -> NEXT
Step 4: FREE PTR
Step 5: END

2. Infix, Postfix, and Prefix Notation

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.

Ekspresi (A + B) * C dapat ditulis sebagai:


[AB+]*C
AB+C* (in the postfix notation)

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.

Contoh mengubah ekspresi infiks ke ekspresi postfiks


(a) (A–B) * (C+D)
[AB–] * [CD+]
AB–CD+*
(b) (A + B) / (C + D) – (D * E)
[AB+] / [CD+] – [DE*]
[AB+CD+/] –

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.

Contoh mengubah ekspresi infiks ke ekspresi prefix:


(a) (A + B) * C
(+AB)*C
*+ABC
(b) (A–B) * (C+D)
[–AB] * [+CD]
*–AB+CD
(c) (A + B) / ( C + D) – ( D * E)
[+AB] / [+CD] – [*DE]
[/+AB+CD] – [*DE]
–/+AB+CD*DE

3. Queue

Konsep queue menggunakan analogi yang diberikan di bawah ini.

• 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.

3.1. Array Representation

Queue dapat dengan mudah direpresentasikan menggunakan array linier. Seperti


yang dinyatakan sebelumnya, setiap queue memiliki variabel FRONT dan REAR
yang menunjuk ke posisi dari mana penghapusan dan penyisipan dapat dilakukan,
masing-masing. Representasi array dari queue ditunjukkan pada Gambar 13 dan 14.

Gambar 13. Queue

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.

Gambar 14. Queue after insertion of a new element

Algoritma penyisipan elemen pada queue


Step 1: IF REAR = MAX-1
Write OVERFLOW
Goto step 4
[END OF IF]
Step 2: IF FRONT = -1 and REAR = -1
SET FRONT = REAR = 0
ELSE
SET REAR = REAR + 1
[END OF IF]
Step 3: SET QUEUE[REAR] = NUM
Step 4: EXIT

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.

Gambar 15. Queue after deletion of an element

Algoritma penghapusan elemen pada queue


Step 1: IF FRONT = -1 OR FRONT > REAR
Write UNDERFLOW
ELSE
SET FRONT = FRONT + 1
[END OF IF]
Step 2: EXIT

3.2. Linked Presentation

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.

Gambar 16. Linked Queue

Insert operation

Operasi insert digunakan untuk memasukkan elemen ke dalam queue. Elemen


baru ditambahkan sebagai elemen terakhir dari queue

Data Structures
Gambar 17. Linked queue

Gambar 18. Linked queue after inserting a new node

Algoritma penyisipan elemen pada linked queue


Step 1: Allocate memory for the new node and name it as PTR
Step 2: SET PTR -> DATA = VAL
Step 3: IF FRONT = NULL
SET FRONT = REAR = PTR
SET FRONT -> NEXT = REAR -> NEXT = NULL
ELSE
SET REAR -> NEXT = PTR
SET REAR = PTR
SET REAR -> NEXT = NULL
[END OF IF]
Step 4: END

Delete operation

Operasi delete digunakan untuk menghapus elemen yang pertama kali


dimasukkan dalam queue, yaitu elemen yang alamatnya disimpan di FRONT

Gambar 19. linked queue

Gambar 20. Linked queue after deletion of an element

Algoritma penghapusan elemen pada linked queue


Step 1: IF FRONT = NULL
Write Underflow
Go to Step 5
[END OF IF]
Step 2: SET PTR = FRONT
Step 3: SET FRONT = FRONT -> NEXT
Step 4: FREE PTR
Step 5: END

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.

Gambar 21. Linear queue

Dalam circular queue, indeks pertama muncul tepat setelah indeks terakhir. Secara
konseptual, Anda dapat memikirkan circular queue seperti yang ditunjukkan pada
Gambar 22.

Gambar 22. Circular Queue

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.

Algoritma penyisipan pada circular queue


Step 1: IF FRONT = 0 and Rear = MAX - 1
Write “OVERFLOW”
Goto step 4
[End OF IF]
Step 2: IF FRONT = -1 and REAR = -1
SET FRONT = REAR = 0
ELSE IF REAR = MAX - 1 and FRONT != 0
SET REAR = 0
ELSE
SET REAR = REAR + 1
[END OF IF]
Step 3: SET QUEUE[REAR] = VAL
Step 4: EXIT

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.

Representasi Linked dari Priority Queue

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.

Gambar 24. Priority queue after insertion of a new node

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 antara Stack dan Queue

• 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

Thareja, R. (2014). Data Structures Using C (second). Oxford University Press.


https://doi.org/10.1136/adc.67.4.533

How to properly insert/delete in a binary search tree in C?


How to properly insert/delete in a binary search tree in C? - Stack Overflow

Data Structures

Anda mungkin juga menyukai