IKL6207 05 Stack Queue
IKL6207 05 Stack Queue
1
2
Stack dan Queue
Struktur data linier
Stack /stek/
Queue /kyu/
3
Stack dan Queue
Array secara generic memungkinkan untuk menambahkan elemen di
posisi mana saja.
Stack hanya mengijinkan menambah dan menghapus elemen dari salah
satu ujung Array.
Queue hanya mengijinkan menambah dari satu ujung Array,
dan hanya mengijinkan menghapus dari ujung yang lain.
4
Stack dan Queue
Tumpukan
Memuat kumpulan data, yang tersusun berurut (linear)
Divisualisasikan secara vertikal
Proses penambahan dan penghapusan data selalu dilakukan pada
sisi/ujung yang sama
Top of stack.
Bekerja dengan prinsip Last In First Out (LIFO)
Data yang terakhir masuk data yang akan di proses terlebih dahulu.
Data yang ada “di bawah” top of stack diperlakukan inaccessible.
5
Tipe Data Abstrak (TDA) Stack
Spesifikasi
Apa data yang akan disimpan dalam Stack?
Operasi apa saja yang valid untuk Stack?
Implementasi
Bagaimana TDA Stack diimplementasikan dalam program?
Mendayagunakan tipe data built-in yang tersedia
Mendayagunakan TDA lain yang sudah diimplementasikan
sebelumnya
6
Stack: Spesifikasi
Add: Push()
Remove: Pop()
Hanya ada 1 “ujung”
Last In First Out (LIFO)
Find: “Melihat” elemen paling atas:
Top()
Elemen paling atas; Top Of Stack (TOS)
Elemen-elemen yang tertumpuk di
bawah TOS “diperlakukan” tidak bisa
diakses
7
Queue: Spesifikasi
Add: Enqueue()
Remove: Dequeue()
First In First Out (FIFO)
Find:
"Melihat" elemen paling depan:
Front()
"Melihat" elemen paling belakang:
Rear()
Elemen-elemen di antara front dan
rear “diperlakukan” tidak bisa
diakses 8
Stack menggunakan Python’s list
Struktur data collections bawaan Python
Push: append()
Pop: pop()
Find:
stack[-1]
index()
9
class Stack:
def __init__(self):
self.items = []
def pop(self):
if len(self.items) > 0:
return self.items.pop()
else:
return None
def top(self):
if len(self.items) > 0:
# return self.items[len(self.items)-1]
return self.items[-1]
else:
return None
10
def size(self):
return len(self.items)
def isEmpty(self):
return self.items == []
```
if len(self.items) > 0:
return False
else:
return True
```
def __str__(self):
return str(self.items)
11
Pemanfaatan Stack
Keterpadanan kurung
Mengubah ekspresi Infix ke Postfix
12
Memeriksa Keterpadanan Kurung
Matched parentheses
( ( ) ( ) )
( ) ( ( ) )
{ ( [ ] [ ] ) ( ) }
Unmatched parentheses
( ( ) ( )
( ( ( ) )
( ( ) ) ) (
{ ( [ ] [ ] ) ) ) }
Gunakan Stack 13
Ekspresi Infix
Ekspresi aritmatika tersusun atas Operand dan Operator
Operator: , , , , ,
Pembatasan masalah: Operator-operator lain tidak dibahas (pangkat,
akar, dsb).
Operator ditulis di antara (“ inside ”) Operand
14
Ekspresi Postfix
Operator ditulis setelah ( post ) operands
15
Patterns
Kenapa seperti itu eskpresi postfix-nya?
Menggunakan algoritma mengubah ekspresi infix menjadi ekspresi
postfix.
Menggunakan penelusuran postorder (dibahas pada Bab Tree).
Urutan operands dalam ekspresi infix maupun postfix tidak berubah.
Urutan operator dalam ekspresi postfix berubah
sesuai dengan urutan operator mana yang diterapkan lebih dulu
Tanda kurung dari ekspresi infix menghilang di ekspresi postfix.
16
Patterns ini digunakan untuk membuat algoritma mengubah ekspresi
infix ke ekspresi postfix.
Stack dapat digunakan
untuk mengevaluasi ekspresi postfix
untuk mengubah ekspresi infix menjadi ekspresi postfix
17
Evaluasi Ekspresi Postfix
Siapkan sebuah stack kosong.
Scan ekspresi postfix dari kiri ke kanan, sampai habis
Jika token adalah sebuah operand,
Push ke dalam stack
Jika token adalah sebuah operator ,
Pop 1 operand, perlakukan sebagai operand kanan
Pop 1 operand lagi, perlakukan sebagai operator kiri
Evaluasi .
Push hasilnya ke dalam stack.
18
Contoh
Infix:
Postfix:
19
No Token Stack Operasi
1 Push
2 Push
3 Push
4 Push
5 Pop, Push
6 Pop, Push
7 Pop, Push
20
Infix to Postfix
Patterns
1 binary operator
Infix:
Postfix:
2 atau lebih binary operator
Left-to-right Associative (presedensi sama)
Infix:
Postfix:
21
Infix to Postfix
Patterns
2 atau lebih binary operator
Infix:
Postfix:
22
Infix to Postfix
Operator with higher precedence
Kita perlu helper functions
23
Infix to Postfix
Presedensi lebih tinggi daripada
Infix:
Postfix:
Infix:
Postfix:
24
Infix to Postfix
Parentheses is considered have higher precedence
25
Infix to Postfix
Pseudocdoe
26
Infix to Postfix
Baca setiap token...
Jika elemen TOS memiliki precedensi lebih besar...:
pop satu per satu, hingga elemen TOS memiliki presedensi lebih
kecil atau stack menjadi kosong.
Setiap elemen yang di-pop ditampilkan di hasil luaran (atau di-
enqueue).
push token operator ke dalam stack
(dequeue semua elemen dalam Queue)
27
Queue
Untuk apa saja?
28
7. Load Balancing in Web Servers
8. Real-Time Simulation Systems
9. Memory Management
10. Event-driven Programming (Pemrograman GUI)
29
Queue menggunakan Python’s
collections.deque
Struktur data collections bawaan
"list-like"
Zero-based indexing
Negative indexing
NOT Slicing!
Harus melakukan import (tidak seperti list)
from collections import deque
30
Double Ended Queue
Antrian
Ujung "kiri" dan "kanan"
"atas" dan "bawah"
"depan" dan "belakang"
Methods
append()
pop()
appendleft()
popleft()
31
from collections import deque
class Queue:
'''Implementasi tipe data Queue. Menggunakan collections.deque
sebagai fondasi.
Elemen baru di-enqueue ke sebelah kiri. Elemen di-dequeue dari sebelah kanan.
32
def __init__(self):
self.items = deque()
def dequeue(self):
if len(self.items) > 0:
return self.items.pop()
else:
return None
33
def isEmpty(self):
if len(self.items) > 0:
return False
else:
return True
def size(self):
pass
def __str__(self):
return str(self.items)
34