Anda di halaman 1dari 89

HALAMAN JUDUL

DOKUMEN BAHAN AJAR


ALGORITMA DAN STRUKTUR DATA
(TKE 215)

Disusun Oleh :
HARI SISWANTORO, S.T.
NIP. 132306838

PROGRAM STUDI TEKNIK ELEKTRO


PROGRAM SARJANA TEKNIK
UNIVERSITAS JENDERAL SOEDIRMAN
PURWOKERTO
2006

“Dilaksanakan atas biaya Anggaran PKPP Universitas Jenderal Soedirman


Tahun Anggaran 2006
Nomor: 5630/J23.16/Pusat P3/PKPP/2005 tanggal 3 Desember 2005”
KATA PENGANTAR

Puji syukur ke hadirat Allah SWT, yang telah memberikan kekuatan kepada penulis
sehingga dapat menyelesaikan penulisan dokumen bahan ajar untuk mata kuliah
Algoritma dan Struktur Data ini. Mata kuliah ini merupakan kelanjutan dari mata kuliah
Dasar Pemrograman. Dengan demikian diharapkan mahasiswa yang mengambil mata
kuliah ini sudah lulus mata kuliah Dasar Pemrograman terlebih dahulu.
Bahan ajar ini terdiri atas tiga bagian utama, yaitu rancangan pembelajaran, materi
kuliah dan modul praktikum. Rancangan pembelajaran berisi tentang rencana jalannya
proses pembelajaran dalam satu semester, atau memuat Garis-garis Besar Program
Pembelajaran (GBPP) dan Satuan Acara Pembelajaran (SAP). Bagian materi kuliah
berisikan pokok-pokok bahasan yang diberikan dalam kuliah. Sedangakan bagian modul
praktikum memuat unit-unit yang dilaksanakan dalam praktikum.
Mempelajari algoritma dan struktur data menjadi kurang lengkap jika tidak
diterapkan dalam salah satu bahasa pemrograman. Bahan ajar ini menggunakan dua
contoh bahasa pemrograman yang saat ini populer digunakan, yaitu Bahasa C dan Java.
Diharapkan mahasiswa dapat melihat variasi implementasi, sekaligus mungkin
mengamati kelebihan dan kekurangan masing-masing bahasa pemrograman.
Akhir kata, semoga bahan ajar dapat bermanfaat bagi mahasiswa atau pengajar.
Ucapan terima kasih kami tujukan kepada panitia PKPP jurusan Teknik Elektro Unsoed,
pengurus jurusan Teknik Elektro Unsoed, sesama rekan pengajar dan juga mahasiswa
yang terlibat langsung dalam pembuatan modul praktikum. Bahan ajar ini masih jauh dari
sempurna, kami berharap kelak akan muncul versi perbaikan di masa yang akan datang.
Sumbang saran para pembaca sangat kami harapkan untuk membuat versi perbaikan
tersebut.

Cilacap, Juli 2006

Hari Siswantoro
Email: hari.s@seitc.net

ii
DAFTAR ISI
HALAMAN JUDUL ________________________________________________________ i
KATA PENGANTAR _______________________________________________________ ii
DAFTAR ISI_____________________________________________________________iii
1. RANCANGAN PEMBELAJARAN ____________________________________________ 1
1.1 Peta Kompetensi ___________________________________________________ 1
1.2 Rancangan Proses Pembelajaran_______________________________________ 2
1.3 Garis-garis Besar Program Pembelajaran ________________________________ 3
1.4 Satuan Acara Pembelajaran___________________________________________ 5
1.4.1 Pertemuan 1 ___________________________________________________ 5
1.4.2 Pertemuan 2 ___________________________________________________ 7
1.4.3 Pertemuan 3 ___________________________________________________ 8
1.4.4 Pertemuan 4 ___________________________________________________ 9
1.4.5 Pertemuan 5 __________________________________________________ 10
1.4.6 Pertemuan 6 __________________________________________________ 11
1.4.7 Pertemuan 7 __________________________________________________ 12
1.4.8 Pertemuan 8 __________________________________________________ 13
1.4.9 Pertemuan 9 __________________________________________________ 14
1.4.10 Pertemuan 10_________________________________________________ 15
1.4.11 Pertemuan 11_________________________________________________ 16
1.4.12 Pertemuan 12_________________________________________________ 17
1.4.13 Pertemuan 13_________________________________________________ 18
1.4.14 Pertemuan 14_________________________________________________ 19
1.4.15 Pertemuan 15_________________________________________________ 20
1.4.16 Pertemuan 16_________________________________________________ 21
2. MATERI KULIAH ______________________________________________________ 22
2.1 Pendahuluan _____________________________________________________ 22
2.2 Rekursi __________________________________________________________ 26
2.3 Pointer dan Linked Object (List) ______________________________________ 28
2.3.1 Pointer _______________________________________________________ 28
2.3.2 Linked List ____________________________________________________ 29
2.4 Stack ___________________________________________________________ 32
2.4.1 Single Stack ___________________________________________________ 32
2.4.2 Double Stack __________________________________________________ 34
2.5 Queue __________________________________________________________ 38
2.5.1 Implementasi Queue dengan Linear Array ___________________________ 39
2.5.2 Implementasi Queue dengan Circular Array __________________________ 41
2.6 Binary Trees ______________________________________________________ 45
2.7 Pemrograman Generic ______________________________________________ 47
2.7.1 List __________________________________________________________ 48
2.7.2 Set __________________________________________________________ 49
2.7.3 Map _________________________________________________________ 52
3. MODUL PRAKTIKUM___________________________________________________ 54
3.1 Unit 1: Linked Objects - List _________________________________________ 54
3.2 Unit 2: Linked Objects - Stack ________________________________________ 61
3.3 Unit 3: Linked Objects - Queue _______________________________________ 66
3.4 Unit 4: Recursion __________________________________________________ 69
3.5 Unit 5: Tree Node _________________________________________________ 76
3.6 Unit 6: Implementasi List____________________________________________ 81
DAFTAR PUSTAKA ______________________________________________________ 86

iii
1. RANCANGAN PEMBELAJARAN

1.1 Peta Kompetensi

Mata kuliah : Algoritma dan Struktur Data


SKS : 3 SKS (2 SKS Teori dan 1 SKS Praktikum)
Semester : III (Tiga)
Kompetensi Umum
Memberikan pemahaman kepada mahasiswa tentang algoritma serta representasi logika
dan fisik berbagai macam struktur data. Dan juga memberikan pemahaman bahwa
sebuah program komputer merupakan gabungan antara algoritma dan struktur data.
Kompetensi Khusus
Setelah mengikuti perkuliahan mahasiswa akan mampu:
1. memahami konsep algoritma dan struktur data,
2. menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai,
3. menjelaskan teknik generic programming dan pemrograman menggunakan collection
classes.

1
1.2 Rancangan Proses Pembelajaran
Institusi : Program Sarjana Teknik
Jurusan Teknik Elektro
Program Studi Teknik Elektro
Tahun Akademik : 2006 / 2007
Semester : Ganjil (III)
Nama Mata Kuliah : Algoritma dan Struktur Data
Kode Mata Kuliah : TKE 215
SKS : 3 SKS (2 SKS Teori dan 1 SKS Praktikum)
Pengampu : Acep Taryana, S.Si., M.T.
Deskripsi Singkat : Mata kuliah ini memberikan pengetahuan kepada mahasiswa
untuk melakukan analisa terhadap sebuah program komputer,
ditinjau atas algoritma yang digunakan untuk memecahkan
masalah serta berbagai struktur data yang merepresentasikan
pengolahan informasi.
Tujuan Pembelajaran : Setelah mengikuti perkuliahan, mahasiswa akan dapat
menjelaskan cara kerja sebuah program komputer
berdasarkan algoritma dan struktur data yang digunakan.
Metode Pembelajaran : 1. Ceramah
2. Diskusi
3. Latihan di kelas
4. Tugas
5. Praktikum
Monitoring Evaluasi :
Evaluasi hasil pembelajaran : Pedoman Penilaian : Penilaian Acuan Patokan (PAP)
A : 80 s/d 100
B : 60 s/d 80
C : 40 s/d 60
D : 20 s/d 40
E : 00 s/d 20
Macam dan bobot evaluasi hasil pembelajaran
Tugas dan Quiz : 10%
UTS : 30%
UAS : 30%
Praktikum : 30%
Evaluasi proses : Waktu evaluasi : tengah dan akhir semester
pembelajaran Materi evaluasi :
1. Korelasi antara kompetensi dengan metode pembelajaran
2. Kondisi proses pembelajaran
3. Kemampuan dosen (fasilitator) dalam pembelajaran
4. Kompetensi mahasiswa sesudah pembelajaran
Referensi : [1] Eck, David J., Introduction to Programming Using Java,
http://math.hws.edu/javanotes/, 2004
[2] Utami, E., Raharjo, S., Struktur Data Menggunakan C di
GNU/Linux, Penerbit Andi, Yogyakarta, 2004
[3] Budiyanto, A., Algoritma dan Pemrograman,
Ilmukomputer.com, 2003
[4] Wahono, R.S., Algoritma dalam Bahasa C,
Ilmukomputer.com, 2003

2
1.3 Garis-garis Besar Program Pembelajaran
Nama Mata Kuliah : Algoritma dan Struktur Data
Kode Mata Kuliah : TKE 215
SKS : 3 (2 SKS Teori dan 1 SKS Praktikum)
Deskripsi Singkat : Mata kuliah ini memberikan pengetahuan kepada mahasiswa untuk melakukan analisa terhadap sebuah program
komputer, ditinjau atas algoritma yang digunakan untuk memecahkan masalah serta berbagai struktur data yang
merepresentasikan pengolahan informasi.
Tujuan Pembelajaran : Setelah mengikuti perkuliahan, mahasiswa akan dapat menjelaskan cara kerja sebuah program komputer
Umum berdasarkan algoritma dan struktur data yang digunakan.

⇒ Materi Perkuliahan
No. Tujuan Pembelajaran Khusus Substansi Materi Fasilitas Metode Waktu
[1] [2] [3] [4] [5] [6]
1 Mahasiswa mampu menjelaskan konsep Ceramah,
1. Konsep algoritma dan struktur data Papan tulis, OHP 1x100 menit
algoritma dan struktur data diskusi
2 Mahasiswa mampu menjelaskan teknik 1. Rekursi Ceramah,
pemrograman menggunakan rekursi 2. Pointer dan Linked objects Papan tulis, OHP diskusi, 7x100 menit
dan struktur data berantai 3. Stack dan queue latihan, tugas
4. Binary tree
3 Mahasiswa mampu menjelaskan teknik 1. Generic programming
generic programming dan 2. List dan set classes Ceramah,
pemrograman menggunakan 3. Map classes Papan tulis, OHP diskusi, 8x100 menit
sekumpulan class 4. Pemrograman menggunakan latihan, tugas
collection class

3
⇒ Materi Praktikum
No. Tujuan Pembelajaran Khusus Substansi Materi Fasilitas Metode Waktu
[1] [2] [3] [4] [5] [6]
1 Mahasiswa mampu menerapkan teknik 1. Rekursi Komputer, Praktikum 6x150 menit
pemrograman menggunakan rekursi 2. Linked objects (List) Papan tulis
dan struktur data berantai dalam 3. Stack
praktek menggunakan salah satu 4. queue
bahasa pemrograman 5. Binary tree
6. Implementasi List

4
1.4 Satuan Acara Pembelajaran
Nama Mata Kuliah : Algoritma dan Struktur Data
Kode Mata Kuliah : TKE 215
SKS : 3 (2 SKS Teori dan 1 SKS Praktikum)
Deskripsi Singkat : Mata kuliah ini memberikan pengetahuan kepada mahasiswa untuk melakukan analisa terhadap sebuah program komputer,
ditinjau atas algoritma yang digunakan untuk memecahkan masalah serta berbagai struktur data yang merepresentasikan
pengolahan informasi.
Tujuan Pembelajaran : Setelah mengikuti perkuliahan, mahasiswa akan dapat menjelaskan cara kerja sebuah program komputer berdasarkan algoritma
Umum dan struktur data yang digunakan.

1.4.1 Pertemuan 1
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan konsep algoritma dan struktur data
Khusus
Substansi Materi : 1. Konsep algoritma dan struktur data

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Menjelaskan peta kompetensi mata kuliah dan Bertanya OHP
tujuan pembelajaran
3. Menjelaskan rancangan pembelajaran
4. Memberikan daftar referensi mata kuliah

2 Penyajian 1. Memaparkan definisi algoritma Menyimak Papan tulis 60 menit

5
No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
2. Memaparkan definisi struktur data Bertanya OHP
3. Memaparkan konsep algoritma dan struktur Menjawab pertanyaan
data
4. Memberikan contoh penerapan algoritma dan
struktur data dalam sebuah contoh pemecahan
masalah nyata menggunakan program
komputer
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

6
1.4.2 Pertemuan 2
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. Rekursi

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memaparkan definisi rekursi Menyimak Papan tulis 60 menit


2. Memaparkan kegunaan teknik rekursi Bertanya OHP
3. Memberikan contoh program yang Menjawab pertanyaan
menggunakan teknik rekursi Memberi umpan balik
4. Memberikan contoh soal teknik rekursi
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

7
1.4.3 Pertemuan 3
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. Pointer dan Linked objects

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memaparkan pengertian pointer Menyimak Papan tulis 60 menit


2. Memaparkan pengertian linked objects Bertanya OHP
3. Memaparkan penggunaan pointer & linked Menjawab pertanyaan
objects Memberi umpan balik
4. Memberikan contoh program yang
menggunakan linked objects
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

8
1.4.4 Pertemuan 4
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. Linked objects (lanjutan)

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memberikan contoh soal mengenai penggunaan Menyimak Papan tulis 60 menit
linked objects Bertanya OHP
2. Memberikan tugas mandiri Mengerjakan soal
Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

9
1.4.5 Pertemuan 5
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. stack

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
Mengumpulkan tugas
2 Penyajian 1. Memaparkan definisi stack Menyimak Papan tulis 60 menit
2. Memaparkan penggunaan stack Bertanya OHP
3. Memberikan contoh program yang Menjawab pertanyaan
menggunakan stack Memberi umpan balik
4. Memberikan contoh soal penggunaan stack
dalam sebuah program
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

10
1.4.6 Pertemuan 6
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. queue

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memaparkan definisi queue Menyimak Papan tulis 60 menit


2. Memaparkan penggunaan queue Bertanya OHP
3. Memberikan contoh program yang Menjawab pertanyaan
menggunakan queue Memberi umpan balik
4. Memberikan contoh soal penggunaan queue
dalam sebuah program
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

11
1.4.7 Pertemuan 7
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. Binary tree

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memaparkan pengertian binary tree Menyimak Papan tulis 60 menit


2. Memaparkan penggunaan binary tree Bertanya OHP
3. Memberikan contoh program yang Menjawab pertanyaan
menggunakan binary tree Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

12
1.4.8 Pertemuan 8
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai
Khusus
Substansi Materi : 1. Binary tree (lanjutan)

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP

2 Penyajian 1. Memberikan contoh soal penggunaan binary Menyimak Papan tulis 60 menit
tree dalam program Bertanya OHP
2. Memberikan tugas mandiri Menjawab pertanyaan
Mengerjakan soal
Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Mengingatkan mahasiswa agar mengadakan OHP
persiapan menghadapi ujian tengah semester
3. Memberikan acuan-acuan lain yang perlu
4. Menutup pertemuan

13
1.4.9 Pertemuan 9
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Generic programming

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 30 menit
2. Membahas jawaban soal ujian tengah semester Bertanya OHP
2 Penyajian 1. Memaparkan pengertian generic programming Menyimak Papan tulis 50 menit
2. Memaparkan implementasi generic Bertanya OHP
programming dalam berbagai bahasa Menjawab pertanyaan
pemrograman yang berbeda Memberi umpan balik
3. Memaparkan klasifikasi struktur data generic
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

14
1.4.10 Pertemuan 10
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Generic programming (lanjutan)

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memberikan contoh program yang Menyimak Papan tulis 60 menit
menggunakan teknik generic programming Bertanya OHP
2. Memberikan contoh soal penggunaan generic Menjawab pertanyaan
programming dalam program Mengerjakan soal
Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

15
1.4.11 Pertemuan 11
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. List classes

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memaparkan pengertian list classes Menyimak Papan tulis 60 menit
2. Memaparkan klasifikasi list classes Bertanya OHP
3. Memaparkan contoh penggunaan list classes Menjawab pertanyaan
dalam program Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

16
1.4.12 Pertemuan 12
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Set classes

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memaparkan pengertian set classes Menyimak Papan tulis 60 menit
2. Memaparkan perbedaan list dan set classes Bertanya OHP
3. Memaparkan contoh penggunaan set classes Menjawab pertanyaan
dalam program (TreeSet dan HashSet) Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

17
1.4.13 Pertemuan 13
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Map classes

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memaparkan pengertian map classes Menyimak Papan tulis 60 menit
2. Memaparkan implementasi antarmuka map Bertanya OHP
3. Memaparkan pengertian Views, Subsets dan Menjawab pertanyaan
SubMaps Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

18
1.4.14 Pertemuan 14
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Map classes (lanjutan)

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memaparkan pengertian hash tables Menyimak Papan tulis 60 menit
2. Memberikan contoh program yang Bertanya OHP
menggunakan map classes Menjawab pertanyaan
3. Memberikan contoh soal penggunaan map Mengerjakan soal
classes dalam program Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

19
1.4.15 Pertemuan 15
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Collection classes

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
2. Mengulang materi pertemuan terakhir Bertanya OHP
2 Penyajian 1. Memaparkan pengertian pemrograman Menyimak Papan tulis 60 menit
menggunakan collection classes Bertanya OHP
2. Memberikan contoh program yang Menjawab pertanyaan
menggunakan collection classes Memberi umpan balik
3 Penutup 1. Menyimpulkan materi pertemuan Menyimak Papan tulis 20 menit
2. Memberikan acuan-acuan lain yang perlu OHP
3. Menutup pertemuan

20
1.4.16 Pertemuan 16
Waktu : 100 menit
Tujuan Pembelajaran : Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes
Khusus
Substansi Materi : 1. Pengulasan materi

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu
[1] [2] [3] [4] [5] [6]
1 Pendahuluan 1. Membuka pertemuan Menyimak Papan tulis 20 menit
OHP
2 Penyajian 1. Mengulas semua materi kuliah sejak pertemuan Menyimak Papan tulis 60 menit
ke-9: generic programming, list and set classes, Bertanya OHP
map classes dan collection classes Menjawab pertanyaan
2. Memberikan contoh soal Mengerjakan soal
Memberi umpan balik
3 Penutup 1. Mengingatkan mahasiswa untuk Menyimak Papan tulis 20 menit
mempersiapkan ujian akhir OHP
2. Memberikan acuan-acuan lain yang perlu
3. Menutup pertemuan

21
2. MATERI KULIAH

2.1 Pendahuluan
Definisi Algoritma
Ditinjau dari asal usul katanya kata Algoritma sendiri
mempunyai sejarah yang aneh. Orang hanya menemukan kata
Algorism yang berarti proses menghitung dengan angka arab. Anda
dikatakan Algorist jika anda menghitung menggunakan Angka Arab.
Para ahli bahasa berusaha menemukan asal kata ini namun hasilnya
kurang memuaskan. Akhirnya para ahli sejarah matematika menemukan asal kata
tersebut yang berasal dari nama seorang ahli matematika dari Uzbekistan Abu Abdullah
Muhammad Ibnu Musa Al-Khuwarizmi (770-840). Al-Khuwarizmi dibaca orang barat
menjadi Algorism. Al-Khuwarizmi menulis buku yang berjudul Kitab Al Jabar Wal-
Muqabala yang artinya “Buku pemugaran dan pengurangan” (The book of restoration
and reduction). Dari judul buku itu kita juga memperoleh akar kata “Aljabar” (Algebra).
Perubahan kata dari Algorism menjadi Algorithm muncul karena kata Algorism sering
dikelirukan dengan Arithmetic, sehingga akhiran –sm berubah menjadi –thm. Karena
perhitungan dengan angka Arab sudah menjadi hal yang biasa. Maka lambat laun kata
Algorithm berangsur-angsur dipakai sebagai metode perhitungan (komputasi) secara
umum, sehingga kehilangan makna kata aslinya. Dalam Bahasa Indonesia, kata
Algorithm diserap menjadi Algoritma.
Kita bisa mendefinisikan algoritma sebagai berikut:
Algoritma adalah logika, metode dan tahapan (urutan) sistematis yang digunakan untuk
memecahkan suatu permasalahan.
Kamus besar bahasa Indonesia (Balai Pustaka 1988) secara formal mendefinisikan
algoritma sebagai:
Algoritma adalah urutan logis pengambilan putusan untuk pemecahan masalah.
Hubungan Algoritma dan Struktur Data
Program adalah kumpulan instruksi komputer, sedangkan metode dan tahapan sistematis
dalam program adalah algoritma. Program ini ditulis dengan menggunakan bahasa
pemrograman. Jadi bisa kita sebut bahwa program adalah suatu implementasi bahasa
pemrograman. Beberapa pakar memberi formula bahwa:
program = struktur data + algoritma

22
Bagaimanapun juga struktur data dan algoritma berhubungan sangat erat pada sebuah
program. Algoritma yang baik tanpa pemilihan struktur data yang tepat akan membuat
program menjadi kurang baik, semikian juga sebaliknya.
Menilai Sebuah Algoritma
Ketika manusia berusaha memecahkan masalah, metode atau teknik yang
digunakan untuk memecahkan masalah kemungkinan bisa lebih dari satu. Dan kita
memilih mana yang terbaik diantara teknik-teknik itu. Hal ini sama juga dengan
algoritma, yang memungkinkan suatu permasalahan dipecahkan dengan metode dan
logika yang berlainan. Lalu bagaimana mengukur mana algoritma yang terbaik ?
Beberapa persyaratan untuk menjadi algoritma yang baik adalah:
• Tingkat kepercayaannya tinggi (realibility). Hasil yang diperoleh dari proses
harus berakurasi tinggi dan benar.
• Pemrosesan yang efisien (low cost). Proses harus diselesaikan secepat
mungkin dan jumlah kalkulasi yang sependek mungkin.
• Bersifat general. Bukan sesuatu yang hanya untuk menyelesaikan satu kasus
saja, tapi juga untuk kasus lain yang lebih general.
• Bisa dikembangkan (expandable). Haruslah sesuatu yang dapat kita
kembangkan lebih jauh berdasarkan perubahan requirement yang ada.
• Mudah dimengerti. Siapapun yang melihat, dia akan bisa memahami algoritma
anda. Sulit dimengertinya suatu program akan membuat sulit pengelolaan.
• Portabilitas yang tinggi (portability). Bisa dengan mudah diimplementasikan
di berbagai platform komputer.
Contoh Algoritma dan Implementasinya
Sebagai contoh sederhana, mari kita berlatih melihat permasalahan, mencoba menyusun
algoritma, dan menerapkan dalam bahasa C.
Permasalahan
Ada seorang guru SD yang ingin membuat rangking nilai ujian 9 orang murid. Nilai ujian
murid adalah sebagai berikut:
56 78 43 96 67 83 51 74 32
Bagaimana algoritma dalam pembuatan rangking nilai tersebut?
Untuk memecahkan masalah di atas, kita bisa menyusun algoritma sebagai berikut:
1. Buat satu variable (misalnya rangking)
2. Set variable rangking = 1
3. Ambil satu nilai sebagai data yang ke a, misalnya 56

23
4. Cek nilai dari paling depan (56) sampai paling belakang (32) (b=0-8). Apabila
nilai tersebut lebih tinggi daripada nilai ke a (56), maka set variable rangking =
ranking + 1.
5. Ulangi proses nomor 2 dengan mengambil data ke (a) berikutnya. Kemudian
mari kita implementasikan algoritma di atas dalam program bahasa C.
Program: Rangking Nilai Ujian
#include <stdio.h>
#define banyaknya_nilai 9
main(){
static int nilai[]={56, 78, 43, 96, 67, 83, 51, 74, 32};
int rangking[banyaknya_nilai];
int a,b;
for (a=0;a<banyaknya_nilai;a++){
rangking[a]=1;
for (b=0;b<banyaknya_nilai;b++){
if (nilai[a]>nilai[b])
rangking[a]++;
}
}
printf("Nilai Ujian \t Rangking\n");
for (a=0;a<banyaknya_nilai;a++){
printf("%d \t\t %d\n",nilai[a], rangking[a]);
}
}

Hasil
Nilai Ujian Rangking
56 4
78 7
43 2
96 9
67 5
83 8
51 3
74 6
32 1

Algoritma Tidak Tergantung Bahasa Pemrograman Dan Mesin Komputer


Notasi Algoritma dapat diterjemahkan ke dalam berbagai bahasa pemrograman.
Analoginya sama dengan resep membuat kue. Sebuah resep dapat ditulis dalam bahasa
apapun. Bahasa Jepang, Inggris, Perancis, Indonesia, dan lain sebagainya. Apapun
bahasanya, kue yang dihasilkan tetap sama asalkan semua aturan pada resep diikuti.

24
Mengapa demikian? Karena setiap juru masak (sebagai pemroses) dapat melakukan
operasi dasar yang sama, seperti mengocok telur, menimbang berat gula, dan lain
sebagainya. Demikian juga halnya dengan komputer. Meskipun setiap komputer berbeda
teknologinya, tetapi secara umum semua komputer dapat melakukan operasi-operasi
dasar dalam pemrograman seperti operasi pembacaan data, operasi perbandingan,
operasi aritmatika, dan sebagainya. Perkembangan teknologi komputer tidak mengubah
operasi-operasi dasar itu, yang berubah hanyalah kecepatan, biaya, atau tingkat
ketelitian. Pada sisi lain setiap program dalam bahasa tingkat tinggi selalu diterjemahkan
kedalam bahasa mesin sebelum akhirnya dikerjakan oleh CPU. Setiap instruksi dalam
bahasa mesin menyajikan operasi dasar yang sesuai, dan menghasilkan efek yang sama
pada setiap komputer.

25
2.2 Rekursi
Untuk memahami pengertian rekursi, perhatikan contoh sederhana singkatan
berikut: GNU. GNU merupakan singkatan dari GNU Not Unix. Mengapa kepanjangannya
masih terdapat singkatan GNU lagi? Karena GNU merupakan singkatan rekursif (bersifat
rekursi).
Rekursi adalah subroutine yang memanggil dirinya sendiri, baik secara langsung
maupun tidak langsung. Bentuk rekursi merupakan alternatif iterasi atau perulangan. Ada
beberapa masalah yang cocok dipecahkan menggunakan teknik rekursi. Akan tetapi,
secara umum teknik rekursi biasanya kurang efisien dibandingkan teknik iterasi karena
rekursi memanggil dirinya sendiri sehingga menyebabkan waktu pemrosesan lebih lama
disbanding iterasi biasa. Proses reskursi akan menggunakan memori stack. Semakin lama
proses rekursi dikerjakan, maka memori stack akan terus berkurang dan akibatnya
memori stack akan habis.
Dalam rekursi sebenarnya terkandung pengertian fungsi, perbedaannya adalah
rekursi bisa memanggil dirinya sendiri sedangkan fungsi harus dipanggil lewat pemanggil
fungsi. Suatu fungsi tidak hanya bisa memanggil fungsi lain, melainkan juga bisa
memanggil dirinya sendiri. Pemanggilan dirinya sendiri bisa berarti proses berulang yang
tidak bisa diketahui kapan berakhir sehingga dalam rekursi harus ada syarat-syarat
berikut:
• Ada titik pemberhentian sebagai pengendali rekursi.
• Adanya langkah induksi yang menuju pada titik pemberhentian.
Berikut ini adalah contoh program yang menerapkan teknik rekursi, program ini
digunakan untuk menghitung bilangan factorial.
#include <stdio.h>
int fact();
main(){
int n, m;
printf(“Masukkan angka: ”);
scanf(“%d”, &n);
m = fact(n);
printf(“Nilai faktorial %d adalah %d. \n”, n, m);
}
int fact(x)
int x;
{

26
if (x==0) return (1);
else return (x * fact(x-1));
}

Perhatikan fungsi fact() di atas, fungsi inilah yang merupakan rekursi karena memanggil
dirinya sendiri. Nilai fact(x) bisa dihitung dari fact(x-1), fact(x-1) bisa dihitung dari fact(x-
2) dan seterusnya. Titik pemberhentian rekursi terjadi saat nilai x adalah 0. Titik
pemberhentian ini mutlak harus ada, jika tidak ada atau semisal ekspresi yang digunakan
untuk menghentikan rekursi tidak pernah tercapai maka fungsi akan mengalami
perulangan yang tidak pernah berhenti (infinite loop). Kondisi infinite loop tersebut
sebenarnya tidak hanya berlaku pada rekursi, tetapi umum berlaku pada semua bentuk
perulangan.
Rekursi dibahas dalam bagian ini dikarenakan teknik rekursi sering digunakan
untuk mengolah berbagai struktur data berantai yang akan dibahas dalam bab-bab
selanjutnya.

27
2.3 Pointer dan Linked Object (List)
2.3.1 Pointer
Pointer dalam bahasa Indonesia berarti penunjuk. Pointer merupakan variabel
yang menyimpan atau menunjuk suatu alamat memori, bukan menyimpan suatu nilai
data. Karena itu, pointer tidak berhubungan langsung dengan data yang aktual. Dengan
kata lain, variabel pointer hanya berisi alamat variabel yang lain yang berisi data tertentu.
Variabel pointer memiliki kelebihan dibanding variabel dengan tipe data lain.
Kelebihannya adalah bersifat dinamis. Variabel ini dapat digunakan pada saat dibutuhkan
saja dan setelah tidak digunakan memori yang baru saja digunakan dapat dibebaskan
dan ditempati oleh variabel lain. Selain itu, ukuran variabel pointer dapat diatur secara
dinamis selama program berjalan. Hal ini berbeda dengan variabel lain yang bersifat
statis, yang setelah dideklarasikan langsung mengambil ruang alamat memori, baik
variabel tersebut digunakan atau tidak.
Contoh deklarasi pointer:
int data=10;
int *ptr, hasil; // ptr dideklarasikan sebagai pointer
ptr=&data; // ptr mengambil alamat variabel data
hasil=*ptr; // variabel hasil mengambil isi alamat yang ditunjuk oleh ptr

Alokasi Dinamis pada Pointer


Tujuan alokasi dinamis adalah untuk menghemat penggunaan memori pada saat
program berjalan. Dengan kata lain, pemakaian memori hanya bersifat sementara dan
akan dibebaskan setelah tidak dipakai lagi.
Dalam bahasa C, alokasi dinamis dapat dilakukan dengan fungsi malloc() untuk
memesan memori dan free() untuk membebaskan memori. Kedua fungsi tersebut
terdapat dalam library <stdlib.h>.
Contoh implementasi pointer dalam program:
#include <stdio.h>
#include <stdlib.h>
main()
{
typedef struct data *ptr;
struct data
{

28
int info;
ptr next;
};
ptr ptr1,ptr2;
int x, y;
x=5;
y=2*x;

ptr1=(ptr)malloc(sizeof(ptr));
ptr1->info=x+2y;

ptr2=(ptr)malloc(sizeof(ptr));
ptr2->info=2*(x+y);

printf(“Isi data yang ditunjuk oleh ptr1: %d\n”, ptr1->info);


printf(“Isi data yang ditunjuk oleh ptr2: %d\n”, ptr2->info);
}

2.3.2 Linked List


Linked adalah koleksi obyek heterogen dengan sifat setiap obyek (kecuali obyek
terakhir) mempunyai penerus dan setiap obyek (kecuali obyek pertama) mempunyai
pendahulu. Salah satu penggunaan pointer adalah untuk membuat linked list atau
senarai berantai. Linked list sendiri dapat diartikan sebagai sekumpulan komponen yang
saling berhubungan (berantai) dengan bantuan pointer. Perhatikan ilustrasi berikut untuk
lebih jelasnya.

Next next Next next null


Gambar 2.1 Beberapa obyek yang saling terhubung membentuk linked list

Masing-masing komponen disebut sebagai simpul atau node. Setiap simpul terbagi
menjadi dua bagian, yaitu bagian data dan bagian penyambung. Bagian data berisi data
yang akan disimpan dan diolah. Sedangkan bagian penyambung berisi alamat simpul
berikutnya.
Berikut ini adalah contoh deklarasi linked list secara umum:
typedef struct node *simpul;

29
struct node
{
int info;
simpul next;
};
simpul awal, akhir, tengah;

Fungsi-fungsi yang dapat dipakai dalam operasi linked list adalah:


1. Fungsi menambah simpul di belakang. Langkah-langkahnya:
a. membuat simpul baru kemudian diisi info baru.
b. simpul paling akhir dihubungkan ke simpul baru.
c. penunjuk pointer akhir diarahkan ke simpul simpul baru.
2. Fungsi menambah simpul di depan. Langkah-langkahnya:
a. membuat simpul baru, kemudian diisi info baru.
b. simpul baru dihubungkan ke simpul awal.
c. penunjuk pointer awal diarahkan ke simpul baru.
3. Fungsi menyisipkan simpul di tengah. Langkah-langkahnya:
a. membuat simpul bantu, kemudian diisi info baru.
b. menentukan di mana simpul baru akan ditambahkan, yaitu dengan
menempatkan pointer bantu pada suatu tempat.
c. pointer baru dihubungkan ke simpul setelah simpul yang ditunjuk oleh
pointer bantu, kemudian penunjuk pointer bantu diarahkan ke simpul
baru.
4. Fungsi menghapus simpul di depan. Langkah-langkahnya:
a. simpul bantu diarahkan pada simpul awal.
b. simpul awal diarahkan ke simpul berikutnya.
c. menghapus simpul bantu.
5. Fungsi menghapus simpul di tengah. Langkah-langkahnya:
a. meletakkan pointer bantu di sebelah kiri simpul yang akan dihapus.
b. simpul yang akan dihapus ditunjuk oleh pointer lain, misalnya pointer
hapus.
c. pointer bantu diarahkan ke simpul yang ditunjuk oleh hapus, kemudian
simpul hapus dihapus.
6. Fungsi menghapus simpul di belakang. Langkah-langkahnya:
a. meletakkan pointer bantu di sebelah kiri simpul yang akan dihapus.

30
b. simpul yang akan dihapus ditunjuk oleh pointer lain, misalnya pointer
hapus.
c. pointer bantu, diarahkan ke simpul yang ditunjuk oleh hapus,
kemudian simpul hapus dihapus.
7. Fungsi mencetak list dengan membaca maju. Langkah-langkahnya:
a. mengatur agar pointer bantu menunjuk simpul yang ditunjuk oleh
pointer awal.
b. setelah isi simpul dibaca dan dicetak, pointer bantu digerakkan ke kanan
untuk membaca simpul berikutnya.
c. proses ini diulang sampai pointer bantu sama dengan pointer akhir.
8. Fungsi mencetak list dengan membaca mundur. Langkah-langkahnya:
a. mengatur agar pointer bantu menunjuk simpul yang ditunjuk oleh
pointer akhir.
b. setelah pointer bantu menunjuk simpul akhir, baru dicetak.
c. proses pencetakan dilanjutkan dengan mencetak isi simpul di sebelah kiri
simpul akhir.
d. proses selesai jika isi simpul paling awal telah selesai dicetak.
9. Fungsi mencari data pada list. Langkah-langkahnya:
a. data yang dicari disimpan dalam suatu variabel, misalkan elemen.
b. membuat pointer bantu sama dengan pointer awal.
c. isi simpul yang ditunjuk oleh pointer bantu dibandingkan dengan
elemen. Jika sama, berarti data yang dicari ditemukan. Jika belum
sama, maka pointer bantu dipindahkan ke simpul di sebelah kanannya
dan proses perbandingan diulang. Proses ini diulang sampai data yang
dicari ditemukan atau sampai pada simpul akhir.

31
2.4 Stack
Stack bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang
diletakkan di atas data yang lain. Di dalam stack, kita dapat menambahkan/menyisipkan
dan mengambil/menghapus data melalui ujung yang sama yang disebut sebagai puncak
stack (top of stack). Stack mempunyai sifat LIFO (Last In First Out), artinya data yang
terakhir masuk adalah data yang pertama keluar.
Bentuk penyajian stack bisa menggunakan tipe data array, tetapi sebenarnya
penyajian stack menggunakan array kurang tepat karena banyaknya elemen dalam array
bersifat statis, sedangkan jumlah elemen stack sangat bervariasi atau dinamis. Meskipun
demikian, array dapat digunakan untuk penyajian stack, tetapi dengan anggapan bahwa
banyaknya elemen maksimal suatu stack tidak melebihi batas maksimum banyaknya
array. Pada suatu saat ukuran stack akan sama dengan ukuran array. Bila diteruskan
menambah data, maka akan terjadi overflow. Oleh karena itu, perlu ditambahkan data
untuk mencatat posisi ujung stack. Ada dua jenis bentuk stack menggunakan array, yaitu
single stack dan double stack.

2.4.1 Single Stack


Single stack dapat dianalogikan dengan sebuah wadah yang diisi benda melalui
satu jalan keluar dan masuk.

A B C D

Gambar 2.2 Ilustrasi Single Stack

Contoh deklarasi single stack adalah sebagai berikut:


#define MAX 50
#define true 1
#define false 0

char stack[MAX];
int top;
Operasi-operasi Single Stack
1. Fungsi init: fungsi yang digunakan untuk inisialisasi atau membuat stack baru yang
masih kosong.
void init(void){

32
top=0;
}

2. Fungsi full: digunakan untuk mengetahui stack penuh atau tidak.


int full(void){
if(top==MAX) return(true);
else return(false);
}
3. Fungsi empty: digunakan untuk mengetahui stack kosong atau tidak.
int empty(void){
if(top==0) return(true);
else return(false);
}
4. Fungsi clear: digunakan untuk mengosongkan stack. Stack dianggap kosong apabila
puncak stack berada pada posisi 0.
void clear(void){
top=0;
printf(“Stack telah dikosongkan\n”);
}
5. Fungsi push: digunakan untuk menambahkan data ke dalam stack. Penambahan data
tidak bisa dilakukan apabila stack sudah penuh. Urutan perintahnya adalah:
a. menambahkan nilai top.
b. memasukkan data pada posisi top.
void push(char info){
if (full() != true)
{
top++;
stack[top]=info;
}
else printf(“Stack overflow...\n”);
}
6. Fungsi pop: digunakan untuk mengeluarkan data teratas stack dengan syarat bahwa
stack tidak kosong. Urutan perintahnya adalah:
a. mengambil data pada posisi top.
b. menurunkan nilai top.

33
char pop(void){
char info;
if(empty() != true)
{
info=stack[top];
top--;
return(info);
}
else printf(“Stack underflow...\n”);
}

2.4.2 Double Stack


Double stack merupakan bentuk pengembangan single stack dengan maksud
untuk menghemat memori. Dalam double stack terdapat dua stack dalam satu array.
Stack 1 bergerak ke kanan dan stack 2 bergerak ke kiri. Double stack dikatakan penuh
apabila puncak stack 1 bertemu dengan puncak stack 2.

top 1 top 2

stack 1 stack 2
1 max
Gambar 2.3 Ilustrasi Double Stack

Deklarasi umum double stack:


#define MAX 50
#define true 1
#define false 0

char stack[MAX];
int top1;
int top2;
Operasi-operasi Double Stack
1. Fungsi init: mendeklarasikan double stack yang kosong.
void init(void){
top1=0;
top2=MAX+1;
}

34
2. Fungsi full: digunakan untuk mengetahui double stack penuh atau tidak.
int full(void){
if (top+1>=top2)
return(true);
else
return(false);
}
3. Fungsi empty: digunakan untuk mengetahui double stack kosong atau tidak.
int empty(int nostack){
switch (nostack)
{
case 1: if (top1==0) return (true);
else return (false);
break;
case 2: if (top2==MAX+1) return (true);
else return (false);
break;
default: printf(“Nomor stack invalid\n”);
break;
}
}
4. Fungsi clear: digunakan untuk mengosongkan salah satu stack.
void clear(int nostack){
switch(nostack)
{
case 1: top1=0;
break;
case 2: top2=MAX+1;
break;
default: printf(“Nomor stack invalid\n”);
break;
}
}
5. Fungsi push: digunakan untuk menambah data ke dalam salah satu stack.
void push(char info, int nostack){

35
if (full() != true)
{
switch(nostack)
{
case 1: top1++;
stack[top1]=info;
break;
case 2: top2--;
stack[top2]=info;
break;
default: printf(“Invalid PUSH...\n”);
break;
}
}
else printf(“Stack overflow...\n”);
}
6. Fungsi pop: digunakan untuk mengeluarkan data teratas salah satu stack.
char pop(int nostack){
char info;
if (empty(nostack) != true)
{
switch(nostack)
{
case 1: info=stack[top1];
top1--;
return(info);
break;
case 2: info=stack[top2];
top2++;
return(info);
break;
default: printf(“Invalid POP...\n”);
break;
}
}

36
else printf(“Stack underflow...\n”);
}

37
2.5 Queue
Secara harfiah queue dapat diartikan sebagai antrian. Queue merupakan kumpulan
data dengan penambahan data hanya melalui satu sisi, yaitu belakang (tail) dan
penghapusan data hanya melalui sisi depan (head). Berbeda dengan stack yang bersifat
LIFO maka queue bersifat FIFO(First In First Out), yaitu data yang pertama masuk akan
keluar terlebih dahulu dan data yang terakhir masuk akan keluar terakhir. Berikut ini
adalah gambaran struktur data queue.

A B C D
keluar awal akhir masuk
Gambar 2.4 Ilustrasi Queue

Elemen yang pertama kali masuk ke dalam queue disebut elemen depan
(front/head of queue), sedangkan elemen yang terakhir kali masuk ke queue disebut
elemen belakang (rear/tail of queue).
Perbedaan antara stack dan queue terdapat pada aturan penambahan dan
penghapusan elemen. Pada stack, operasi penambahan dan penghapusan elemen
dilakukan di satu ujung. Elemen yang terakhir kali dimasukkan akan berada paling dekat
dengan ujung atau dianggap paling atas sehingga pada operasi penghapusan, elemen
teratas tersebut akan dihapus paling awal, sifat demikian dikenal dengan LIFO. Pada
queue, operasi tersebut dilakukan di tempat yang berbeda. Penambahan elemen selalu
dilakukan melalui salah satu ujung, menempati posisi di belakang elemen-elemen yang
sudah masuk sebelumnya atau menjadi elemen paling belakang. Sedangkan
penghapusan elemen dilakukan di ujung yang berbeda, yaitu pada posisi elemen yang
masuk paling awal atau elemen terdepan. Sifat yang demikian dikenal dengan FIFO.
Operasi-operasi standar pada queue adalah:
1. membuat queue atau inisialisasi.
2. mengecek apakah queue penuh.
3. mengecek apakah queue kosong.
4. memasukkan elemen ke dalam queue atau InQueue (Insert Queue).
5. Menghapus elemen queue atau DeQueue (Delete Queue).

38
2.5.1 Implementasi Queue dengan Linear Array
Disebut juga queue dengan model fisik, yaitu bagian depan queue selalu
menempati posisi pertama array. Queue dengan linear array secara umum dapat
dideklarasikan sebagai berikut:
#define MAX 50
#define true 1
#define false 0

struct queue
{
char info[MAX];
int awal;
int akhir;
};
Operasi-operasi queue dengan linear array:
1. Fungsi init: digunakan untuk membuat queue baru atau kosong, yaiitu dengan
memberi nilai awal (head) dan nilai akhir(tail) dengan nol.
void init(void)
{
antri.awal=0;
antri.akhir=0;
}
2. Fungsi full: digunakan untuk mengetahui apakah queue sudah penuh atau belum.
Dilakukan dengan memeriksa nilai akhir (tail) apakah sudah sama dengan maksimal
queue.
int full(void)
{
if (antri.akhir==MAX) return(true);
else return(false);
}
3. Fungsi empty: digunakan untuk mengetahui apakah queue masih kosong atau tidak.
Dilakukan dengan memeriksa nilai akhir (tail) bernilai nol atau tidak.
int empty(void)
{
if(antri.akhir==0) return(true);

39
else return(false);
}
4. Fungsi InQueue: digunakan untuk menambahkan elemen ke dalam queue. Jika
queue masih kosong, maka nilai awal (head) dan nilai akhir (tail) diubah menjadi 1.
Jika tidak kosong dan queue belum penuh, maka nilai akhir (tail) akan ditambah 1.
void inQueue(char elemen)
{
if empty() == true)
{
antri.awal=1;
antri.akhir=1;
antri.info[antri.awal]=elemen;
}
else
{
if (full() != true)
{
antri.akhir++;
antri.info[antri.akhir]=elemen;
}
else printf(“Queue overflow...\n”);
}
}
5. Fungsi DeQueue: digunakan untuk mengambil elemen dari queue, dengan cara
memindahkan semua elemen satu langkah ke posisi depannya sehingga elemen yang
paling depan tertimpa.
char deQueue(void)
{
char isi;
int i;
if (empty() != true)
{
isi=antri.info[antri.awal];
for(i=antri.awal;i<=antri.akhir-1;i++)
antri.info[i]=antri.info[i+1];

40
antri.akhir--;
return(isi);
}
else printf(“Queue underflow...\n”);
}
6. Fungsi clear: digunakan untuk menghapus semua elemen dalam queue. Ada dua
cara yang bisa digunakan, yaitu menuliskan fungsi seperti inisialisasi atau memanggil
fungsi DeQueue sampai queue kosong.
void clear(void)
{
while (empty()==0) deQueue();
}

2.5.2 Implementasi Queue dengan Circular Array


Salah satu variasi array adalah array melingkar (circular array), artinya array dapat
diakses mulai dari sembarang indeks (indeks awal) ke arah indeks terakhir (maksimum
array), lalu memutar ke indeks pertama hingga kembali ke indeks awal. Circular array
adalah array yang dibuat seakan-akan merupakan sebuah lingkaran dengan titik awal
dan titik akhir saling bersebelahan jika array tersebut masih kosong. Jumlah data yang
dapat ditampung oleh array ini adalah besarnya ukuran array dikurangi 1. Misalnya besar
array adalah 8, maka jumlah data yang dapat ditampung adalah 7.

akhir=MAX

awal=1

Gambar 2.5 Ilustrasi Circular Array

Dengan circular array, meskipun posisi terakhir telah terpakai, elemen baru tetap
dapat ditambahkan pada posisi pertama jika posisi pertama dalam keadaan kosong. Jika

41
nilai head dan tail mencapai maksimum, maka akan dikembalikan ke posisi awal.
Deklarasi queue menggunakan circular array secara umum:
#define MAX 50
#define true 1
#define false 0

struct queue
{
char info[MAX];
int awal;
int akhir;
};
struct queue antri;
Operasi-operasi queue dengan circular array:
1. Fungsi init: digunakan untuk membuat queue kosong dengan memberikan nilai
awal=1 dan nilai akhir=MAX.
void init(void)
{
antri.awal=1;
antri.akhir=MAX;
}
2. Fungsi full: digunakan untuk memeriksa queue dalam keadaan penuh atau tidak.
int full(void)
{
if(((antri.akhir%MAX)+1)%MAX)+1==antri.awal)
return(true);
else
return(false);
}
3. Fungsi empty: digunakan untuk memeriksa queue dalam keadaan kosong atau tidak.
Jika posisi akhir dan awal masih bersebelahan dan nilai posisi akhir lebih besar
daripada awal, maka queue dalam keadaan kosong.
int empty(void)
{
if((antri.akhir%MAX)+1==antri.awal)

42
return(true);
else
return(false);
}
4. Fungsi InQueue: digunakan untuk menambahkan elemen baru. Langkah-langkahnya
adalah:
a. menggeser posisi belakang.
b. memasukkan elemen baru.
c. posisi depan tidak berubah, yang berubah hanya bagian belakang.
void inQueue(char elemen)
{
if(full() != true)
{
antri.akhir=(antri.akhir%MAX)+1;
antri.info[antri.akhir]=elemen;
}
else printf(“Queue overflow...\n”);
}
5. Fungsi Dequeue: digunakan untuk mengambil elemen. Langkah-langkahnya adalah:
a. mengambil elemen paling depan.
b. menggeser posisi depan.
c. posisi belakang tetap tidak berubah, yang berubah hanya bagian depan.
char deQueue(void)
{
char isi;
int i;
if(empty() != true)
{
isi=antri.info[antri.awal];
antri.awal=(antri.awal%MAX)+1;
return(isi);
}
else printf(“Queue underflow...\n”);
}

43
6. Fungsi clear: digunakan untuk menghapus semua elemen queue. Operasinya sama
dengan fungsi inisialisasi.

44
2.6 Binary Trees
Sebelumnya kita sudah mengenal struktur data list, yang berupa obyek-obyek
yang saling terkait. Dalam list, satu obyek hanya terkait dengan satu obyek berikutnya
melalui sebuah pointer. List dapat dikembangkan menjadi struktur data yang lebih
kompleks, misalnya dengan menambah jumlah pointer dalam obyek. Misal dengan
penambahan satu pointer lagi. Artinya bahwa jika masing-masing obyek memiliki dua
pointer, ada dua obyek lain yang ditunjuknya. Struktur yang demikian dikenal sebagai
binary trees atau dikenal juga sebagai Tree Node.

Gambar 2.6 Ilustrasi Binary Tree

Masing-masing obyek atau node dalam binary tree memiliki dua pointer yang biasa
disebut left dan right. Berikut ini adalah contoh deklarasi obyek dalam binary tree (dalam
Java):
class TreeNode {
int item; // Data dalam node ini.
TreeNode left; // Pointer ke subtree kiri.
TreeNode right; // Pointer ke subtree kanan.
}
Pointer left dan right sebuah obyek dapat bernilai null (tidak menunjuk ke obyek
lain) atau dapat menunjuk ke obyek lain. Node atau obyek yang menunjuk ke node lain
disebut sebagai parent, sedangkan node yang ditunjuk disebut sebagai child. Tidak
semua struktur data berantai yang tersusun atas tree node adalah binary tree. Bisa

45
disebut binary tree jika ada satu node dalam tree yang tidak memiliki parent (disebut
root) dan setiap node dalam tree mempunyai satu parent. Dengan demikian tidak
mungkin terjadi loop dalam binary tree, dengan kata lain tidak mungkin mengikuti rantai
pointer dan kemudian kembali lagi ke node yang sama.
Pada gambar ilustrasi binary tree di atas, terdapat node yang tidak menunjuk ke
obyek manapun. Node ini disebut sebagai leaf. Ciri-ciri leaf adalah kedua pointernya
bernilai null , karena tidak menunjuk ke node manapun.
Sebagai contoh, berikut ini adalah permasalahan bagaimana menghitung jumlah
node yang ada dalam sebuah binary tree. Kendala utama yang dihadapi dalam masalah
ini adalah menandai node mana yang belum dihitung. Permasalahan ini dapat
diselesaikan dengan mudah menggunakan teknik rekursi.
static int countNodes( TreeNode root ) {
if ( root == null )
return 0; // Tree kosong.
else {
int count = 1; // Memuali penghitungan dimulai dengan root.
count += countNodes(root.left); // Menambahkan jumlah node di
// subtree kiri.
count += countNodes(root.right); // Menambahkan jumlah node di
// subtree kanan.
return count;
}
}
Contoh selanjutnya adalah menampilkan isi masing-masing node yang juga
menggunakan teknik rekursi.
static void preorderPrint( TreeNode root ) {
if ( root != null ) {
System.out.print( root.item + " " );
preorderPrint( root.left );
preorderPrint( root.right );
}
}

46
2.7 Pemrograman Generic
Pemrograman generic mengandung makna penulisan kode program yang dapat
bekerja untuk semua tipe data. Ide pemrograman generic muncul ketika seringnya
terjadi penulisan kode yang sama secara berulang-ulang. Sehingga timbul pemborosan
waktu maupun tenaga. Sebagai contoh, Java mempunyai class yang bernama ArrayList.
ArrayList merupakan array dinamis untuk tipe object. Karena setiap class adalah sub-
class object, maka semua obyek yang dimiliki oleh semua class dapat disimpan dalam
ArrayList. Kode ArrayList hanya ditulis sekali tetapi dapat bekerja untuk semua tipe
obyek.
Contoh lain, untuk dapat mengakses class-class generic dalam Java, biasa
digunakan pernyataan import di awal kode. Misal untuk dapat mengakses class-class di
paket java.util, maka diperlukan pernyataan import java.util.*.
Berbagai bahasa pemrograman mempunyai gaya sendiri-sendiri dalam
menerapkan teknik pemrograman generic. Sebagai contoh misalnya, berikut ini adalah
potongan kode dalam C++ yang menggunakan fitur template.
template<class ItemType>
void sort( ItemType A[], int count ) {
for (int i = count-1; i > 0; i--) {
int position_of_max = 0;
for (int j = 1; j <= count ; j++)
if ( A[j] > A[position_of_max] )
position_of_max = j;
ItemType temp = A[count];
A[count] = A[position_of_max];
A[position_of_max] = temp;
}
}
Dalam kode di atas, jika kata ItemType diganti dengan int, maka kita akan memperoleh
fungsi untuk mengurutkan array integer. Sedangkan jika diganti dengan string maka kita
akan memperoleh fungsi untuk mengurutkan array string. Dengan kata lain, sepotong
kode template di atas bisa digunakan untuk berbagai tipe data yang berbeda. C++
mempunyai sekumpulan kode template yang bisa digunakan, yaitu terkemas dalam
Standard Template Library (STL). STL relatif cukup kompleks, tapi merupakan fitur yang
sangat menarik dalam C++.

47
Sedangkan Java memiliki dua kategori struktur data generic, yaitu collection dan
map. Collection adalah sekumpulan obyek, sedangkan map merupakan penghubungan
obyek di satu set dengan obyek di set yang lain. Map bisa dianalogikan dengan
penghubungan antara nama dengan nomer telepon dalam sebuah buku telepon.
Collection sendiri dibagi menjadi dua, yaitu list dan set. List merupakan sekumpulan
obyek yang tertata dalam urutan linier. Sedangkan set merupakan sekumpulan obyek
yang tidak mempunyai obyek kembar.

2.7.1 List
Dalam Java ada dua cara untuk menyatakan list, yaitu menggunakan array dinamis
atau linked list. Kedua cara ini tercakup dalam kumpulan class java.util.ArrayList and
java.util.LinkedList. ArrayList menyimpan obyek dalam array sedangkan LinkedList
menyimpan obyek dalam node-node yang saling terkait oleh pointer.
Contoh operasi-operasi atau metode dalam list:
1. list.get(index): digunakan untuk mengambil obyek dalam posisi index.
2. list.set(index,obj): digunakan untuk menyimpan obyek di posisi index, jika posisi
tersebut sebelumnya sudah terisi maka akan ditimpa.
3. list.add(index,obj): digunakan untuk menyisipkan obyek di posisi index.
4. list.remove(index): digunakan untuk menghapus obyek pada posisi index.
5. list.indexOf(obj): digunakan untuk mengetahui di mana posisi sebuah obyek dalam
list.
Metode-metode di atas berlaku baik untuk ArrayList maupun LinkedList. Contoh operasi
berikut ini hanya berlaku khusus untuk LinkedList:
1. linkedlist.getFirst(): digunakan untuk mengambil obyek pertama dalam list.
2. linkedlist.getLast(): digunakan untuk mengambil obyek terakhir dalam list.
3. linkedlist.removeFirst(): digunakan untuk menghapus obyek pertama dalam list.
4. linkedlist.removeLast(): digunakan untuk menghapus obyek terakhir dalam list.
5. linkedlist.addFirst(obj): digunakan untuk menambah obyek di awal list.
6. linkedlist.addLast(obj): digunakan untuk menambah obyek di akhir list.
Berikut ini adalah contoh implementasi list untuk menambahkan data pada list,
tetapi diinginkan supaya list yang sudah ada tetap dalam kondisi terurut naik.
static void orderedInsert(List list, Comparable newItem)
{
// Precondition: The items in list are sorted into ascending
// order, according to the compareTo method.
// newitem.compareTo(item) must be defined for

48
// each item in the list.
//
// Postcondition: newItem has been added to the list in its
// correct position, so that the list is still
// sorted into ascending order.

ListIterator iter = list.listIterator();

// Move the iterator so that it points to the position where


// newItem should be inserted into the list. If newItem is
// bigger than all the items in the list, then the while loop
// will end when iter.hasNext() becomes false, that is, when
// the iterator has reached the end of the list.

while (iter.hasNext()) {
Object item = iter.next();
if (newItem.compareTo(item) <= 0) {
// newItem should come BEFORE item in the list.
// Move the iterator back one space so that
// it points to the correct insertion point,
// and end the loop.
iter.previous();
break;
}
}
iter.add(newItem);
}

2.7.2 Set
Seperti sudah diungkapkan di muka, bahwa set adalah sekumpulan obyek yang
setiap obyek hanya pernah muncul sekali. Set menerapkan semua metode yang ada
dalam collection, dengan satu tambahan ada langkah untuk memastikan bahwa tidak ada
obyek yang kembar dalam set. Java mempunyai dua class yang menerapkan antarmuka
set, yaitu java.util.TreeSet dan java.util.HashSet. TreeSet mempunyai sifat bahwa setiap
elemen dalam set selalu diurutkan dalam urut naik. Contoh penerapan TreeSet dalam
kasus pembacaan daftar kata dalam sebuah file, kemudian daftar kata tersebut diurutkan

49
dan hanya dimunculkan sekali jika ada yang kembar. Algoritma untuk memecahkan
masalah tersebut menggunakan TreeSet adalah:
TreeSet words = new TreeSet();
while there is more data in the input file:
Let word = the next word from the file.
words.add(word);

Iterator iter = words.iterator();


while (iter.hasNext()):
Write iter.next() to the output file.
Sedangkan kode program yang lebih lengkap adalah sebagai berikut:
import java.io.*;
import java.util.TreeSet;
import java.util.Iterator;

public class WordListWithTreeSet {

public static void main(String[] args) {

TreeSet words;
TextReader in;
PrintWriter out;

String inputFileName;
String outputFileName;

words = new TreeSet();

TextIO.put("Input file name? ");


inputFileName = TextIO.getln().trim();
try {
in = new TextReader(new FileReader(inputFileName));
}
catch (FileNotFoundException e) {
TextIO.putln("Can't find file \"" + inputFileName + "\".");

50
return;
}

TextIO.put("Output file name? ");


outputFileName = TextIO.getln().trim();
try {
out = new PrintWriter(new FileWriter(outputFileName));
}
catch (IOException e) {
TextIO.putln("Can't open file \"" + outputFileName + "\" for output.");
TextIO.putln(e.toString());
return;
}

try {
while (true) {
while ( ! in.eof() && ! Character.isLetter(in.peek()) )
in.getAnyChar();
if (in.eof())
break;

words.add(in.getAlpha()); // Add the word to the TreeSet.


// Has no effect if the word is
// already there!
}
}
catch (TextReader.Error e) {
TextIO.putln("An error occured while reading from the input file.");
TextIO.putln(e.toString());
return;
}

Iterator iter = words.iterator();


while (iter.hasNext())
out.println(iter.next());

51
if (out.checkError() == true) {
TextIO.putln("Some error occured while writing output.");
TextIO.putln("Output might be incomplete or invalid.");
}
else {
TextIO.putln( words.size() + " words from \"" + inputFileName +
"\" output to \"" + outputFileName + "\".");
}
}
}

2.7.3 Map
Map merupakan sejenis array yang disamaratakan. Dikatakan sejenis atau mirip
dengan array karena map juga didefinisikan menggunakan operasi get dan put. Bedanya,
array menggunakan integer sebagai indeks untuk mengakses elemen array, sedangkan
map bisa menggunakan sembarang obyek. Bahasa pemrograman lain ada yang
menggunakan istilah associative array untuk menyebut map.
Dalam Java, map didefinisikan dalam antarmuka java.util.Map. Berikut ini adalah
metode-metode yang dalam map:
1. map.get(key): mengambil obyek yang dipetakan dengan obyek key.
2. map.put(key,value): memetakan obyek value dengan obyek key.
3. map.putAll(map2): menyalin semua pemetaan di map2 ke map.
4. map.remove(key): menghapus pemetaan obyek dengan key.
5. map.containsKey(key): mengetahui apakah ada obyek-obyek yang dipetakan ke key.
6. map.containsValue(value): mengetahui apakah ada value/obyek yang dipetakan ke
beberapa key.
7. map.size(): mengetahui berapa jumlah pemetaan yang ada.
8. map.isEmpty(): mengetahui apakah tidak ada pemetaan dalam map.
9. map.clear(): menghapus semua pemetaan yang ada.
Berikut ini adalah contoh implementasi map dalam program buku telepon:
import java.util.HashMap;
public class PhoneDirectory
{
private HashMap info = new HashMap();
public void addEntry(String name, String number) {

52
info.put(name,number);
}

public String getNumber(String name)


{
return (String)info.get(name);
}
}

53
3. MODUL PRAKTIKUM

3.1 Unit 1: Linked Objects - List


[ A brief theory ]
List adalah salah satu tipe struktur data, terdiri dari beberapa objek yang terkait oleh
pointer. Kita bisa melakukan operasi penambahan elemen, penghapusan elemen, dan
pencarian dalam list.
Pada bagian ini kita akan membangun objek bertipe ElmtList yang didefinisikan sebagai
berikut:
class ElmtList {
int info; //berisi informasi
ElmtList next; //pointer ke objek berikutnya
}
ElmtList tersebut bisa dikatakan sebagai node. Istilah node sering digunakan untuk
menunjukkan salah satu dari beberapa objek dalam sebuah linked data struktur (untuk
selanjutnya kita sebut List). Objek bertipe ElmtList bisa dikaitkan satu sama. Node
terakhir (elemen list yang terakhir) bisa diidentifikasi dengan variable next milik object
terakhir tersebut yang memiliki nilai null atau tidak menunjuk ke node yang lain.

Next next Next next null

Gambar 1 Lima objek yang terkait.

Pada awal pembentukan list, hanya ada satu element (dengan next bernilai null), lalu
untuk menambahkan element maka diperlukan operasi penyisipan elemen. Penyisipan
bisa dilakukan dengan beberapa cara:
- Insert first
- Insert after
- Insert last
Penyisipan dengan insert first akan menambahkan elemen baru yang berada sebelum
elemen pertama (elemen pertama tergeser menjadi kedua). Jadi jika kita melakukan
insert first maka akan ditambahkan element baru sebelum elemen pertama.

54
Penyisipan dengan insert after akan menambahkan elemen baru setelah suatu elemen,
dengan insert after kita bisa menambahkan elemen baru di tengah list.

55
[ Unit 1 ]
Dalam unit 1-1 ini Anda Anda akan melihat sebuah list sederhana terbentuk. Dengan
menggunakan class ElmtList sebagai objek yang menjadi elemen list. Berikut ini adalah
kode sumber ElmtList yang akan Anda gunakan, ketikanlah di teks editor Anda :
[ 1 ] public class ElmtList {
[ 2 ] protected int info;
[ 3 ] protected ElmtList next;

[ 4 ] public ElmtList(int i, ElmtList next) {


[ 5 ] this.info = i;
[ 6 ] this.next = next;
[ 7 ] }

[ 8 ] public int getInfo(){


[ 9 ] return info;
[ 10 ] }
[ 11 ] }
Ketikkan sebelas baris kode di atas dan simpanlah dengan nama “ElmtList.java”. (Ingat
jangan tulis nomor baris ! )
Pada baris ke-1 terlihat ada access specifier public yang mengandung arti bahwa class
ElmtList ini dapat diakses dari class lainnya.
Pada baris ke-2 dan ke-3 terlihat ada access specifier protected ini hanya dapat diakses
oleh member dari class ElmtList, member dari class turunannya, dan member dari class
lain yang berada dalam package yang sama.
Baris ke-4 sampai dengan ke-7 adalah konstruktor class ElmtList. Bentuk konstruktor
sama dengan method, tetapi perbedaan utamanya adalah konstruktor harus memiliki
nama yang sama dengan nama class dan tidak memiliki nilai kembalian apapun bahkan
void sekalipun(lihat baris ke-4).
Baris ke-8 sampai ke-10 adalah sebuah method milik ElmtList yang akan mengembalikan
nilai integer. Method ini berfungsi untuk mengambil nilai yang ada di variable info.
Kenapa tidak mengakses variabel info secara langsung saja? Dalam Object Oriented
Programming1, variabel dalam masing-masing class benar-benar dibuat terisolasi dan
terlindungi untuk mencegah terjadinya perubahan nilai variabel baik sengaja atau tidak
disengaja yang tidak diinginkan (sekarang Anda mengerti kenapa variabel info dan next
diberi access specifier protected?). Dengan melindungi akses terhadap variabel tersebut,

1 Object Oriented Progamming – sebuah paradigma pemrograman baru yang muncul setelah

manusia krisis software di tahun 1970an. OOP merepresentasikan objek-objek di dunia nyata
sebagai class dan menggunakannya dalam program. Sehingga program yang dibuat benar-benar
merepresentasikan “real world”.

56
maka pemeliharaan maupun pengembangan program untuk aplikasi yang lebih besar
akan lebih mudah (OOP dibuat untuk memudahkan dalam pengembangan software).
Ketik kode sumber berikut dan simpanlah dengan nama “ListLinier.java”
[ 1 ] import java.lang.String;
[ 2 ] public class ListLinier {
[ 3 ]
[ 4 ] private ElmtList first;
[ 5 ]
[ 6 ] public ListLinier() {
[ 7 ] this.first=null;
[ 8 ] }
[ 9 ]
[ 10 ] public void insertFirst(ElmtList n) {
[ 11 ] n.next =first;
[ 12 ] first=n;
[ 13 ] }
[ 14 ]
[ 15 ] public void deleteFirst() {
[ 16 ] if (first==null) first = first.next;
[ 17 ] }
[ 18 ]
[ 19 ] public void deleteAll(){
[ 20 ] first = null;
[ 21 ] }
[ 22 ]
[ 23 ] public void deleteNode(ElmtList n){
[ 24 ] ElmtList p=first;
[ 25 ] ElmtList prev=null;
[ 26 ] while (p!=n) {
[ 27 ] Prev=p;
[ 28 ] p=p.next;
[ 29 ] }
[ 30 ] if (p==n) {
[ 31 ] if (prev == null) first=null;
[ 32 ] else prev.next=n.next;
[ 33 ] }
[ 34 ] }
[ 35 ]
[ 36 ] public ElmtList createNode(int i){
[ 37 ] return (new ElmtList(i,null));
[ 38 ] }
[ 39 ]
[ 40 ] public void PrintAll() {
[ 41 ] for (ElmtList cur=first;cur!=null;cur=cur.next){
[ 42 ] System.out.println(cur.info + "" );
[ 43 ] }
[ 44 ] }
[ 45 ]
[ 46 ] }
Class ListLinier ini berisi berbagai manipulasi yang dilakukan terhadap class ElmtList.
Amati dan pahami masing-masing blok program. Berbagai operasi terhadap list dilakukan
dengan memanipulasi ElmtList!

57
Untuk melihat bagaimana ElmtList digunakan, kita membutuhkan program seperti
berikut. Ketiklah kode sumber berikut ini dan simpanlah dengan nama “MainList.java”.
[ 1 ] public class MainList {
[ 2 ] public static void main(String[] args) {
[ 3 ] ListLinier L1,L2;
[ 4 ] L1=new ListLinier();
[ 5 ] L2 = L1;
[ 6 ] for (int i=0; i<10;i++){
[ 7 ] L1.insertFirst(L1.createNode(i));
[ 8 ] }
[ 9 ] L1.PrintAll(); // cetak list 1
[ 10 ] System.out.println("<<Pemisah>>\n");
[ 11 ] L2.PrintAll(); // cetak list 2
[ 12 ] }
[ 13 ] }
Setelah ketiga kode sumber tersebut diatas sudah Anda simpan, maka lakukanlah
kompilasi terhadap “MainList.java” (jangan lupa, letakkan ketiga kode sumber tersebut
dalam satu direktori).
Setelah itu, run program utama yang telah Anda buat (MainList). Amati hasil eksekusi
program.

58
[ Problem ]
1. Jelaskan kenapa pada baris ke-11 “MainList.java”, PrintAll bisa mencetak semua
elemen list L2. Padahal list L2 tidak dikenai operasi apapun seperti list L1 pada baris
ke-8?
2. Di awal unit 1 dijelaskan bahwa ada beberapa operasi insert pada List.
Tambahkanlah beberapa baris kode berikut dalam class ListLinier.
public void insertAfter(ElmtList bef, ElmtList n){
n.next=bef.next;
bef.next=n;
}

public void insertLast(ElmtList n){


ElmtList p=first;
if (p==null) {
first = n;
}else {
while (p.next!=null) p=p.next;
p.next = n;
}
}

public void deleteLast() {


if (first==null) return;
ElmtList p=first;
ElmtList prev=null;
While (p.next!=null){
Prev=p;
p=p.next;
}
if (prev == null) first = null;
else prev.next = null;
}

3. Rubahlah insertFirst dalam MainList menjadi insertAfter. Lalu run program dan amati
hasilnya!
4. Rubah kembali MainList, sehingga sekarang menggunakan insertLast, run lagi dan
amati hasilnya.
5. Terangkan perbedaan masing-masing operasi insert elemen pada List di atas.
6. Coba implementasikan deleteLast() dalam MainList, dan setelah deleteLast()
dipanggil, apa yang terjadi?
7. Analisa kode sumber ListLinier yang telah Anda tulis, dan jelaskan masing-masing
method (fungsi atau prosedur) dengan menggambarkan flowchart masing-masing
method tersebut.

59
8. Pada baris ke-4 sampai baris ke-7 pada class ElmtList merupakan konstruktor dari
class tersebut. Jelaskan apa yang dimaksud dengan konstruktor? Ada 2 jenis
konstruktor, sebutkan dan jelaskan!

60
3.2 Unit 2: Linked Objects - Stack
[ A brief theory ]
Stack atau tumpukan, terdiri dari beberapa elemen yang tersusun dari elemen paling
bawah sampai elemen paling atas. Yang unik dari stack adalah semua operasi yang
dilakukan terhadap stack, dilakukan pada elemen yang paling atas (TOP). Jadi hanya
satu elemen stack yang bisa diakses dalam satu waktu, yaitu elemen TOP.
Ada beberapa operasi terhadap stack, misalnya push dan pop. Push akan menyisipkan
elemen baru diatas TOP. Dan operasi pop akan menghapus TOP.
56
12 12
5 5
48 48
32 32
1 1

Gambar 2 Ilustrasi operasi push pada sebuah stack.

Di gambar 3 terlihat bahwa elemen baru ditambahkan setelah dilakukan operasi


push(56), sehingga di atas 12 terdapat elemen baru bernilai 56.
Pada bagian ini kita akan membangun objek bertipe Node yang didefinisikan sebagai
berikut:
class Node {
int info;
Node next;
}
Konsep stack ini banyak digunakan dalam pemrograman komputer. Ketika suatu program
memiliki suatu subprogram (fungsi) maka fungsi stack diperlukan. Komputer harus
menyimpan alamat kode ketika program utama karena program menjalankan
subprogram, dan stack digunakan untuk menyimpan alamat kode eksekusi terakhir
tersebut. Lalu komputer melakukan push alamat kode subprogram yang harus dijalankan
diatas program utama tersebut. Lalu ketika subprogram selesai dijalankan, maka
komputer harus kembali menjalankan program utama, dan alamat kode eksekusi terakhir
tadi di pop dari stack.

[ Imagine it ! ]

61
Anda bisa membayangkan stack sebagai setumpukan piring. Yang bisa kita lakukan
terhadap piring tersebut adalah menambahkan piring, atau mengambil piring. Dan semua
yang kita lakukan tersebut hanya bisa dilakukan terhadap piring yang berada pada posisi
paling atas (ingat TOP!). Kita tidak pernah akan bisa mengambil satu piring dari tengah-
tengah tumpukan (jelas sekali perbedaan stack dengan list!).

62
[ Unit 2 ]
Pada unit 2-1 ini akan kita lihat bagaimana stack yang elemennya menyimpan informasi
bertipe integer bekerja. Teknik melakukan push dan pop pada stack dan bagaimana
mencetak semua elemen stack.
Ketiklah kode sumber berikut ini dengan teks editor Anda dan simpanlah dengan nama
file “StackOfInts.java”.
[ 1 ] public class StackOfInts {
[ 2 ] private static class Node {
[ 3 ] int item;
[ 4 ] Node next;
[ 5 ] }
[ 6 ]
[ 7 ] private Node top;
[ 8 ]
[ 9 ] public void push( int N ) {
[ 10 ] Node newTop;
[ 11 ] newTop = new Node();
[ 12 ] newTop.item = N;
[ 13 ] newTop.next = top;
[ 14 ] top = newTop;
[ 15 ] }
[ 16 ]
[ 17 ] public int pop() {
[ 18 ] int topItem = top.item;
[ 19 ] top = top.next;
[ 20 ] return topItem;
[ 21 ] }
[ 22 ]
[ 23 ] public boolean isEmpty() {
[ 24 ] return (top == null);
[ 25 ] }
[ 26 ]
[ 27 ] public void printAll() {
[ 28 ] int x;
[ 29 ] while(!isEmpty()) {
[ 30 ] x = pop();
[ 31 ] System.out.println(x);
[ 32 ] }
[ 33 ] }
[ 34 ] }

Class StackOfInts di atas memiliki empat method yaitu push, pop, isEmpty, dan printAll.
Sekarang, kita buat program utamanya, ketiklah source berikut :

63
[ 1 ] public class MainStack {
[ 2 ] public static void main(String args[]) {
[ 3 ] StackOfInts stack;
[ 4 ]
[ 5 ] stack = new StackOfInts();
[ 6 ]
[ 7 ] for(int i=1;i<5;i++) {
[ 8 ] stack.push(i);
[ 9 ] }
[ 10 ] stack.printAll();
[ 11 ] }
[ 12 ] }
Simpan dengan nama “MainStack.java”. Lakukan compilation pada MainStack, dan coba
jalankan program tersebut. Anda akan mendapatkan bahwa integer yang Anda masukkan
terakhir, akan tercetak pertama (LIFO).

[ Facts ]
Ternyata class Node bisa didefinisikan dalam file “StackOfInts.java”, dan bisa langsung
dipakai. Membuktikan pendeklarasian suatu class (inner class) di dalam class lain (outer
class).

[ Problem ]
1. Coba hapus class Node dari StackOfInts, dan deklarasikan class Node dalam file yang
terpisah.
2. Apa yang terjadi pada stack setelah di push sebanyak satu kali?
3. Apakah yang terjadi setelah dilakukan perintah printAll pada stack?
4. Setelah dilakukan perintah printAll kemudian dikenakan perintah printAll lagi,
ternyata tidak ada elemen stack yang tercetak (stack kosong). Kenapa bisa
demikian?
5. Analisa kode sumber stack yang telah Anda tulis, dan jelaskan masing-masing
method (fungsi atau prosedur) dengan menggambarkan flowchart masing-masing
method tersebut.

64
[ Supplement ]
Inner Class
Dalam Java, Anda diizinkan untuk mendeklarasikan suatu class dalam class. Class yang
didefinisikan di dalam class ini disebut dengan inner class. Bisa dilihat dalam class
StackOfInts, class Node dideklarasikan di dalamnya. Untuk memudahkan penjelasan, kita
sebut class dimana inner class tersebut dideklarasikan sebagai outer class, jadi
StackOfInts adalah outer class.Node dideklarasikan di dalamnya. Untuk memudahkan
penjelasan, kita sebut class dimana inner class tersebut dideklarasikan sebagai outer
class, jadi StackOfInts adalah outer class.
Beberapa hal yang perlu Anda perhatikan tentang inner class ini antara lain:
- Oleh karena inner class sendiri merupakan bagian dari class, maka Java akan
memperlakukannya seperti member class lainnya sehingga Anda dapat
mendeklarasikannya dengan menggunakan access specifier.
- Inner class dapat mengakses semua member dari outer class dan begitu juga
sebaliknya tanpa terpengaruh oleh access specifier yang ada.
- Anda dapat menggunakan inner class ini layaknya class normal, namun apakah class
ini dapat digunakan di luar outer classnya, bergantung pada access specifier yang
dipakai untuk mendeklarasikan inner class ini.
- Anda hanya dapat membuat instance dari inner class (dengan perintah new) di
dalam outer class nya saja.

65
3.3 Unit 3: Linked Objects - Queue
[ A brief theory ]
Queue atau antrian sama seperti list, hanya saja memiliki batasan dalam penambahan
atau penghapusan elemen. Untuk melakukan operasi penambahan elemen terhadap
queue, hanya bisa dilakukan terhadap tail (ujung belakang antrian), sedangkan untuk
melakukan penghapusan elemen, dilakukan terhadap head (ujung depan antrian). Jadi
Queue bersifat FIFO (First In First Out).
Sekali lagi, kita akan menggunakan class Node yang telah kita buat pada unit 2. Untuk
memudahkan penjelasan, operasi penambahan elemen kita sebut enqueue dan operasi

Gambar 3 Operasi penghapusan (dequeue) dan penambahan (enqueue)


pada Queue.
penghapusan elemen kita sebut dequeue. Enqueue akan memasukkan sebuah integer ke
dalam Queue dan dequeue akan menghapus nilai elemen terdepan (Head) dan
mengembalikan nilainya.

66
[ Unit 3 –1 ]
Pada unit 3-1 ini akan kita lihat bagaimana Queue bekerja, dan bagaimana operasi
enqueue dan dequeue berpengaruh terhadapnya. Kita masih menggunakan class Node
sebagai elemen penyusun Queue, jadi Anda hanya tinggal menambahkan class berikut:
[ 1 ] public class QueueOfInts {
[ 2 ] private Node head = null;
[ 3 ] private Node tail = null;
[ 4 ]
[ 5 ] void enqueue( int N ) {
[ 6 ] Node newTail = new Node();
[ 7 ] newTail.item = N;
[ 8 ] if (head == null) {
[ 9 ] head = newTail;
[ 10 ] tail = newTail;
[ 11 ] }
[ 12 ] else {
[ 13 ] tail.next = newTail;
[ 14 ] tail = newTail;
[ 15 ] }
[ 16 ] }
[ 17 ]
[ 18 ] int dequeue() {
[ 19 ] int firstItem = head.item;
[ 20 ] head = head.next;
[ 21 ] if (head == null) {
[ 22 ] tail = null;
[ 23 ] }
[ 24 ] return firstItem;
[ 25 ] }
[ 26 ]
[ 27 ] boolean isEmpty() {
[ 28 ] return (head == null);
[ 29 ] }
[ 30 ]
[ 31 ] void printAll() {
[ 32 ] Node runner = new Node();
[ 33 ] runner = head;
[ 34 ] runner.next = head.next;
[ 35 ] while(runner != null){
[ 36 ] System.out.println(" "+runner.item+"
");
[ 37 ] runner = runner.next;
[ 38 ] }
[ 39 ] }
[ 40 ] }
Simpanlah source di atas dengan nama “QueueOfInts.java”. Kemudian ketiklah program
berikut sebagai program utamanya :

67
[ 1] public class MainQueue {
[ 2] public static void main(String args[]) {
[ 3] QueueOfInts queue = new QueueOfInts();
[ 4]
[ 5] for(int i=1;i<6;i++) {
[ 6] queue.enqueue(i);
[ 7] }
[ 8]
[ 9] System.out.print("Sebelum dequeue() :");
[ 10 ] queue.printAll();
[ 11 ] item = queue.dequeue();
[ 12 ] System.out.println("\nSetelah dequeue() yang pertama :");
[ 13 ] System.out.println(item+" .............[DIHAPUS]");
[ 14 ] item = queue.dequeue();
[ 15 ] System.out.println("\nnSetelah dequeue() yang kedua :");
[ 16 ] System.out.println(item+" .............[DIHAPUS]");
[ 17 ] System.out.print("\nElemen Queue:");
[ 18 ] queue.printAll();
[ 19 ] }
[ 20 ] }
Simpan program utama diatas dengan nama “MainQueue.java” dan kemudian run
MainQueue tersebut dan amati hasilnya.

[ Problem ]

1. Jelaskan apa yang dimaksud dengan FIFO pada queue ?


2. Apa yang dimaksud dengan enqueue dan dequeue ?
3. Pada saat kita menggunakan perintah enqueue, kita membutuhkan parameter
masukan, contoh : enqueue (7). Tapi hal ini tidak berlaku untuk perintah dequeue,
dequeue tidak membutuhkan parameter masukan. Hal apakah yang membedakan
kedua perintah tersebut ? Jelaskan !
4. Analisa kode sumber queue yang telah Anda tulis, dan jelaskan masing-masing
method (fungsi atau prosedur) dengan menggambarkan flowchart masing-masing
method tersebut.

68
3.4 Unit 4: Recursion
[ A brief theory ]
Recursion
Definisi recursive bisa menjelaskan situasi yang sangat kompleks dengan hanya sedikit
kata-kata. Mendefinisikan istilah "ancestor" (nenek moyang) tanpa menggunakan rekursi
mungkin akan sangat sulit seperti parent, atau grandparent, atau great-grandparent,
atau great-great-grandparent, dan seterusnya. Tapi dengan mengatakan "dan
seterusnya" maka tidak akan terlalu rumit. Hal yang sama terjadi ketika kita
mendefinisikan sebuah "directory" sebagai "sebuah file yang merupakan daftar dari file-
file, dimana beberapa file bisa merupakan daftar dari beberapa file, dimana beberapa
dari file tersebut bisa merupakan daftar beberapa file, dan seterusnya". Begitu juga jika
kita berusaha mendefinisikan statement dalam Java. Sebuah "statement" dalam Java bisa
berupa sebuah statement while, yang mana terdiri dari sebuah kata "while", sebuah
kondisi bernilai boolean, dan suatu statement!
Rekursi bisa digunakan sebagai teknik programming. Sebuah subroutine rekursif adalah
subroutine yang memanggil dirinya sendiri, baik secara langsung maupun tidak langsung.
#Program yang akan kita buat kali ini adalah algoritma rekursif untuk melakukan sorting
pada sebuah array, mengurutkan item dari nilai terkecil ke yang terbesar. Algoritma
Selection Sort dan Insertion sort cukup sederhana, tetapi keduanya agak lambat, ketika
diterapkan pada array yang besar. Algoritma sortir yang paling cepat adalah Quicksort,
sebuah algoritma rekursif.
Algoritma Quicksort didasarkan pada sebuah ide yang sederhana: Diberikan sebuah
array, pilih item manapun dari array. Item yang dipilih tersebut selanjutnya kita sebut
pivot. (Dalam praktek kali ini, kita akan gunakan item pertama dari array.) Pindah semua
item yang lebih kecil dari pivot ke bagian awal list, dan pindahkan semua item yang lebih
besar dari pivot ke akhir dari list. Sekarang, taruh pivot diantara dua kumpulan item tadi.
Posisi pivot tersebut sudah tidak akan dipindah-pindah lagi. Kita sebut prosedur tersebut
QuicksortStep.

Before : 27 56 84 35 22 20 13 2 9 16

After : 22 20 13 2 9 16 27 56 84 35

QuicksortStep tidak rekursif, ia hanya digunakan sebagai subroutine oleh Quicksort.


Dengan subroutine QuicksortStep ini, Quicksort menjadi mudah. Algoritma Quicksort

69
untuk melakukan sorting pada sebuah array menerapkan QuicksortStep pada array,
kemudian menerapkan Quicksort secara rekursif pada item yang berada di sebelah kiri
dan sebelah kanan pivot.
Berikut ini adalah kode sumber class Cquicksort:

70
[ 1 ] public class CQuicksort {
[ 2 ] static void quicksort(int[] A, int lo, int hi) {
[ 3 ] // Apply quicksort to put the array elements between
[ 4 ] // position lo and position hi into increasing order.
[ 5 ] if (hi <= lo) {
[ 6 ] // The list has length one or zero. Nothing needs
[ 7 ] // to be done, so just return from the subroutine.
[ 8 ] return;
[ 9 ] }
[ 10 ] else {
[ 11 ] // Apply quicksortStep and get the pivot position.
[ 12 ] // Then apply quicksort to sort the items that
[ 13 ] // precede the pivot and the items that follow it.
[ 14 ] int pivotPosition = quicksortStep(A, lo, hi);
[ 15 ] quicksort(A, lo, pivotPosition - 1);
[ 16 ] quicksort(A, pivotPosition + 1, hi);
[ 17 ] }
[ 18 ] }
[ 19 ] static int quicksortStep(int[] A, int lo, int hi) {
[ 20 ] // Apply QuicksortStep to the list of items in
[ 21 ] // locations lo through hi in the array A. The value
[ 22 ] // returned by this routine is the final position
[ 23 ] // of the pivot item in the array.
[ 24 ] int pivot = A[lo]; // Get the pivot value.
[ 25 ] // The numbers hi and lo mark the endpoints of a range
[ 26 ] // of numbers that have not yet been tested. Decrease hi
[ 27 ] // and increase lo until they become equal, moving numbers
[ 28 ] // bigger than pivot so that they lie above hi and moving
[ 29 ] // numbers less than the pivot so that they lie below lo.
[ 30 ] // When we begin, A[lo] is an available space, since it used
[ 31 ] // to hold the pivot.
[ 32 ] while (hi > lo) {
[ 33 ] while (hi > lo && A[hi] > pivot) {
[ 34 ] // Move hi down past numbers greater than pivot.
[ 35 ] // These numbers do not have to be moved.
[ 36 ] hi--;
[ 37 ] }
[ 38 ] if (hi = = lo)
[ 39 ] break;
[ 40 ] // The number A[hi] is less than pivot. Move it into
[ 41 ] // the available space at A[lo], leaving an available
[ 42 ] // space at A[hi].
[ 43 ] A[lo] = A[hi];
[ 44 ] lo++;
[ 45 ] while (hi > lo && A[lo] < pivot) {
[ 46 ] // Move lo up past numbers less than pivot.
[ 47 ] // These numbers do not have to be moved.
[ 48 ] lo++;
[ 49 ] }
[ 50 ] if (hi == lo)
[ 51 ] break;
[ 52 ] // The number A[lo] is greater than pivot. Move it into
[ 53 ] // the available space at A[hi], leaving an available
[ 54 ] // space at A[lo].
[ 55 ] A[hi] = A[lo];
[ 56 ] Hi--;
[ 57 ] } // end while
[ 58 ] // At this point, lo has become equal to hi, and there is
[ 59 ] // an available space at that position. This position lies
[ 60 ] // between numbers less than pivot and numbers greater than
[ 61 ] // pivot. Put pivot in this space and return its location.
[ 62 ] A[lo] = pivot;
[ 63 ] Return lo;
[ 64 ] } // end QuicksortStep
[ 65 ] }

71
Simpanlah file diatas dengan nama “Cquicksort.java”. Pada baris ke berapakah quicksort
memanggil dirinya sendiri?
Berikut ini adalah source program yang menerapkan Quicksort:
[ 1 ] import java.lang.*;
[ 2 ] public class mainQuicksort {
[ 3 ] public static void main(String[] args) {
[ 4 ] CQuicksort sort = new CQuicksort();
[ 5 ] int[] array = new int[10];
[ 6 ] int lo = 0;
[ 7 ] int hi = array.length - 1;
[ 8 ] for(int i=0;i<=array.length-1;i++)
[ 9 ] array[i] = (int)(Math.random()*100);
[ 10 ] System.out.println("Before Quicksort : ");
[ 11 ] System.out.print(" ");
[ 12 ] for(int i=0;i<=array.length-1;i++)
[ 13 ] System.out.print(array[i]+" ");
[ 14 ]
[ 15 ] sort.quicksort(array,lo,hi);//sorting array
[ 16 ] System.out.println("\nAfter Quicksort: ");
[ 17 ] System.out.print(" ");
[ 18 ] for(int i=0;i<=array.length-1;i++)
[ 19 ] System.out.print(array[i]+" ");
[ 20 ] }
[ 21 ] }

Perhatikan baris ke-9 ( array[i] = (int)(Math.random()*100); ), kita menggunakan type


casting2 pada hasil perkalian Math.random()*100 karena Math.random() menghasilkan
double. Jika kita tidak melakukan type casting double menjadi integer, maka akan
mengalami error ketika kompilasi:
mainQuicksort.java:9: possible loss of precision
found : double
required: int
array[i] = (Math.random()*100);
^
1 error

2
Type casting adalah penyesuaian tipe data, seperti contoh di baris ke-9, hasil perkalian antara
angka random (angka random bernilai diantara 0 dan 1) dengan 100, adalah bilangan real (tipe
float atau double). Sedangkan elemen array bertipe integer (bilangan bulat), maka casting dari tipe
double ke integer harus dilakukan.

72
[ Problem ]

1. Analisa kode sumber sorting yang telah Anda tulis, dan jelaskan masing-masing
method (fungsi atau prosedur) dengan menggambarkan flowchart masing-masing
method tersebut.
2. Bagaimana prinsip dasar selection sort ?
3. Jelaskan mekanisme pemanggilan suatu fungsi atau method secara rekursif !
4. Sebutkan mekanisme sorting yang lain ! Jelaskan !

73
[ Supplement ]
Sorting Array
Sorting berarti mengatur kembali semua item dalam array dalam urutan tertentu (dari
kecil ke besar atau sebaliknya). Ada beberapa algoritma sorting selain Quicksort:
Insertion Sort
Metode sorting ini bisa diterapkan dalam menjaga array dalam urutan tertentu. Misalkan
kita memiliki array yang telah tersortir dan kita ingin memasukkan sebuah item ke dalam
array. Jika kita ingin memastikan bahwa array yang telah berubah tersebut masih tetap
dalam urutan tertentu, maka item baru harus dimasukkan dalam posisi tertentu yang
tepat, misalnya semua item yang memiliki nilai lebih kecil berada sebelumnya dan item
yang lebih besar berada di posisi sesudahnya. Ini berarti memindahkan setiap item yang
lebih besar satu elemen ke kanan, sehingga terbentuk sebuah ruang kosong untuk
elemen baru ini.

74
[ Supplement ]
Selection Sort
Metode sorting ini menggunakan ide menemukan item dengan nilai terbesar dalam array
lalu memindahkannya ke bagian akhir array (jika array harus dalam urutan dari kecil ke
besar). Jika item terbesar sudah berada di posisi yang benar, kita bisa menerapkan hal
yang sama untuk item yang tersisa lainnya. Yaitu, menemukan item terbesar berikutnya,
dan memindahkan ke bagian akhir.
static void selectionSort(int[] A) {
// Sort A into increasing order, using selection sort

for (int lastPlace = A.length-1; lastPlace > 0; lastPlace--) {


// Find the largest item among A[0], A[1], ...,
// A[lastPlace], and move it into position lastPlace
// by swapping it with the number that is currently
// in position lastPlace.

int maxLoc = 0; // Location of largest item seen so far.

for (int j = 1; j <= lastPlace; j++) {


if (A[j] > A[maxLoc]) {
// Since A[j] is bigger than the maximum we've seen
// so far, j is the new location of the maximum value
// we've seen so far.
maxLoc = j;
}
}
int temp = A[maxLoc]; // Swap largest item with A[lastPlace].
A[maxLoc] = A[lastPlace];
A[lastPlace] = temp;

} // end of for loop


}

75
3.5 Unit 5: Tree Node
[ A brief theory ]
Tree node adalah salah satu tipe struktur data, terdiri dari beberapa objek yang terkait
dengan pointer. Yang perlu dibedakan pada tree node dengan struktur data yang lain
ialah tree node mempunyai dua percabangan di tiap objek yang menjadi anggotanya.
Percabangan tersebut yaitu cabang kiri atau biasa di sebut left dan cabang kanan atau
yang disebut sebagai right. Secara umum dalam sebuah objek tree node terdapat tiga
variable yaitu info, right, dan left. Variable info berfungsi untuk menampung data pada
tree node, sementara right dan left merupakan pointer yang menunjuk ke simpul
berikutnya. Namun bila tidak ada lagi simpul yang ditunjuk oleh right atau left maka
pointer tersebut akan menunjuk ke ground(null).Bagian paling atas dari sebuah tree
disebut dengan root.

Secara skematik suatu tree node bisa digambarkan sebagai berikut :

4 3

5 2 6 7

8 9

Bagian paling atas dari sebuah tree node disebut root, mempunyai dua cabang kiri(left)
dan kanan (right), cabang dari root tersebut juga akan mempunyai cabang di bawahnya
yang juga left dan right, dan seterusnya. Hal tersebut mirip dengan suatu susunan
silsilah dalam suatu keluarga. Namun karena dalam hal ini tree hanya mempunyai dua
cabang maka sruktur data seperti ini juga disebut dengan “binary tree”.

76
Berikut ini adalah kode sumber untuk class TreeNode. Ketiklah di teks editor Anda, dan
simpan dengan nama TreeNode.java :
public class TreeNode {
String item;
TreeNode left;
TreeNode right;
TreeNode(String str){
item=str;
}

static TreeNode root;


static int countNode(TreeNode node){
if(node==null){
return 0;
}
else{
int leftCount=countNode(node.left);
int rightCount=countNode(node.right);
return 1+leftCount+rightCount;
}
}
static void printpreOrder(TreeNode root){
if(root!=null){
System.out.println(root.item+"");
printpreOrder(root.left);
printpreOrder(root.right);
}
}
static void printpostOrder(TreeNode root){
if(root!=null){
printpostOrder(root.left);
printpostOrder(root.right);
System.out.println(root.item+"");
}
}
static void printinOrder(TreeNode root){
if(root!=null){
printinOrder(root.left);
System.out.println(root.item+"");
printinOrder(root.right);
}
}

Bila kita perhatikan pada kode sumber yang baru saja anda ketik terdapat beberapa

method atau fungsi yaitu countNode, printpreOrder, printpostOrder, printinOrder ketiga

fungsi tersebut merupakan recursion, coba anda buka lagi unit 3 tentang rekursif.

Terlihat jelas pada ketiga method atau fungsi tersebut bahwa rekursif dilakukan

berulang-ulang baik pada sisi kiri ( left ) maupun sisi kanan ( right ) dari Tree Node.

77
Setelah kita membuat kelas TreeNode, sekarang akan kita implementasikan dalam

sebuah main program berikut:

public class mainnode {


public static void main(String args[]){

TreeNode node9=new TreeNode("u");


node9.left=null;
node9.right=null;

TreeNode node8=new TreeNode("k");


node8.left=null;
node8.right=node9;

TreeNode node7=new TreeNode("a");


node7.left=null;
node7.right=node8;

TreeNode node5=new TreeNode("a");


node5.left=null;
node5.right=node7;

TreeNode node4=new TreeNode("y");


node4.left=node5;
node4.right=null;

TreeNode node2=new TreeNode("i");


node2.left=node4;
node2.right=null;

TreeNode node6=new TreeNode("i");


node6.left=null;
node6.right=null;

TreeNode node12=new TreeNode("s");


node12.left=null;
node12.right=null;

TreeNode node13=new TreeNode("a");


node13.left=null;
node13.right=null;

TreeNode node11=new TreeNode("i");


node11.left=node12;
node11.right=node13;

TreeNode node10=new TreeNode("b");


node10.left=null;
node10.right=node11;

TreeNode node3=new TreeNode("d");


node3.left=node10;
node3.right=node6;

78
TreeNode node1=new TreeNode("r");
node1.left=node2;
node1.right=node3;

int jumlahNode;
jumlahNode =TreeNode.countNode(node1);
System.out.println("Jumlah node pada TreeNode adalah :
"+jumlahNode);
System.out.println("\nIsi dari TreeNode adalah : ");
//TreeNode.printpreOrder(node1);
//TreeNode.printpostOrder(node1);
TreeNode.printinOrder(node1);

}
}

Setelah kode sumber di atas telah selesai anda ketik simpan dengan nama
“mainnode.java”. Lkukan kompilasi terhadap program utama yang telah kita buat
tersebut. Amati hasil keluaran dari program yang telah kita buat. Lakukan penggantian
method printpreOrder dengan method printpostOrder, amati apa yang terjadi, lakukan
pula untuk method printinOrder. Bandingkan hasil dari ketiganya dan analisis dalam
laporan anda.
Bila kita perhatikan setiap node dari treenode diberi indek angka untuk memudahkan kita
dalam kita menentukkan kemana alamat(pointer) tujuan selanjutnya dari suatu node
tersebut. Sekarang kita ambil contoh node5, node ini dideklarasikan setelah node7. bila
kita balik, mendeklarasikan node5 terlebih dahulu maka akan muncul kesalahan dalam
program yang kita buat. Hal ini terjadi karena bagian right dari node5 menunjuk kepada
node7, sementara node7 baru terbentuk setelah node5 maka yang terjadi adalah
“missing pointer” yaitu suatu keadaan dimana pointer yang ditunjukkan tidak ada.

79
[ Problem ]
1. Node mana yang merupakan root dari treeNode pada program utama “mainnode” di
atas? Jelaskan alasan anda memilih node tersebut sebagai root!
2. Bila kita lihat dalam class “mainnode” setiap objek tree node diberi suatu nilai
karakter, bila kita mengganti karakter tersebut dengan angka ternyata program akan
mengalami error, mengapa demikian?bagian mana dari kode sumber yang harus
dirubah agar tidak ada error? Tuliskan kode sumber perubahan tersebut!
3. Gambarkan suatu diagram mekanisme rekursif dari method atau fungsi yang ada
pada class “TreeNode”, dan jelaskan!

80
3.6 Unit 6: Implementasi List
[ A brief theory ]
Implementasi List
Dalam pemrograman, implementasi List sangat luas. List sangat berguna dalam
manipulasi suatu struktur data. Jika pada awal praktikum, kita hanya mengenal List yang
elemennya merupakan data sederhana, yaitu sebuah bilangan bulat (integer), maka kali
ini kita akan mencoba mengimplementasikan List yang memiliki elemen yang sedikit lebih
kompleks. Kita akan mencoba membuat sebuah program buku telepon yang berisi data
tentang nama teman kita, alamatnya dan nomor teleponnya. Struktur data tersebut, akan
kita implementasikan sebagai elemen dari sebuah List.
Berikut ini adalah rancangan elemen List (node) yang akan kita buat:

Nama variable Tipe Keterangan


index Integer (int) Nomor identitas data buku telepon
nama String Nama
alamat String Alamat
telepon String Nomor telepon

Di tabel terlihat ada variabel tambahan, yaitu index. Mungkin untuk saat ini tidak terlalu
diperlukan. Tapi jika data nomor telepon yang kita simpan cukup banyak, dan misalnya
ada dua orang yang memiliki nama dan alamat yang sama (diasumsikan ada
kemungkinan terjadi data nama dan alamat yang sama tapi nomor telepon berbeda)
maka index ini lah yang akan menjadi pembeda kedua data tersebut.
Sekarang kita sudah memiliki rancangan elemen List, yaitu struktur data yang terdiri dari
4 variable. Selanjutnya kita coba mendefinisikan struktur data tersebut sebagai suatu
class. Misalnya kita beri nama class tersebut PhoneListElement. Berikut ini adalah contoh
class yang bisa kita buat berdasarkan rancangan diatas.

81
Kode sumber untuk class PhoneListElement :
public class PhoneListElement {
private String nama;
private String alamat;
private String telepon;
private int index;
protected PhoneListElement next;

public PhoneListElement(int id, String nama, String alamat,


String telepon, PhoneListElement next){
index = id;
this.nama = nama;
this.alamat = alamat;
this.telepon = telepon;
this.next = next;
}

public void setNama(String name){


nama = name;
}

public void setAlamat(String alamat){


this.alamat = alamat;
}

public void setTelepon(String phone){


telepon = phone;
}

public String getNama(){


return nama;
}

public String getAlamat(){


return alamat;
}

public String getTelepon(){


return telepon;
}
}
Simpanlah kode sumber class PhoneListElement tersebut dengan nama
PhoneListElement.java.
Lalu kita buat implementasi element List tersebut dalam sebuah List :

82
Kode sumber class PhoneList:
import java.lang.String;

public class PhoneList {

private PhoneListElement first;


public PhoneList() { // Constructor class list linear
this.first=null;
}

public void PrintAll() {


if (first.next == null)
System.out.println("List kosong....");
else
for (PhoneListElement cur=first;cur!=null;cur=cur.next){
System.out.println("Nama : "+ cur.getNama());
System.out.println("Alamat : "+ cur.getAlamat());
System.out.println("Telepon : "+ cur.getTelepon());
System.out.println();
}
}

public void insertFirst(PhoneListElement n) {


n.next =first;
first=n;
}

public void insertAfter(PhoneListElement bef, PhoneListElement


n){
n.next=bef.next;
bef.next=n;
}

public void insertLast(PhoneListElement n){


PhoneListElement p=first;
if (p==null) {
first = n;

}else {
while (p.next!=null) p=p.next;
p.next = n;
}
}

public void deleteFirst() {


if (first==null) first = first.next;
}

public void deleteLast() {


if (first==null) return;
PhoneListElement p=first;
PhoneListElement prev=null;
while (p.next!=null){
prev=p;
p=p.next;
}

83
if (prev == null) first = null;
else prev.next = null;
}

public void deleteAll(){


first = null;
}

public void deleteNode(PhoneListElement n){


PhoneListElement p=first;
PhoneListElement prev=null;
while (p!=n) {
prev=p;
p=p.next;
}
if (p==n) {
if (prev == null) first=null;
else prev.next=n.next;
}
}
public boolean find(String searchItem) {
PhoneListElement runner;

runner = first;
while ( runner != null ) {
if ( runner.getNama() == searchItem )
return true;
runner = runner.next;
}
return false;

public PhoneListElement createNode(int i,String nama,String


alamat,String telepon){
return (new PhoneListElement(i,nama,alamat,telepon,null));
}

}
Lalu agar program buku telepon bisa berjalan, kita buat instance (objek) PhoneList di
program utama (main program) berikut:
import java.io.*;

public class MainPhoneList {


public static void main(String[] args) {
InputStreamReader stdin=new InputStreamReader(System.in);
BufferedReader console = new BufferedReader(stdin);
String nama = "nama"; // harus inisialisasi
String alamat = "alamat";
String telepon = "telepon";
PhoneList L1,L2;
L1=new PhoneList();
L2 = L1;
for (int i=0; i<2;i++){

84
System.out.print("Nama : ");
try {
nama = console.readLine();
}
catch(IOException ioex){
System.out.println("Input error");
System.exit(1);}

System.out.print("Alamat : ");
try {
alamat = console.readLine();
}
catch(IOException ioex){
System.out.println("Input error");
System.exit(1);}

System.out.print("Telepon : ");
try {
telepon = console.readLine();
}
catch(IOException ioex){
System.out.println("Input error");
System.exit(1);}
System.out.println();
L1.insertLast(L1.createNode(i,nama,alamat,telepon));

}
System.out.println("Isi PhoneBook : ");
L1.PrintAll();
System.out.println("<< Copy >>\n"); L2.PrintAll();
}
}
Lakukan kompilasi dan jalankan program di atas!

[ Problem ]
1. Analisa kode sumber program utama di atas! Pahami alur programnya dan buatlah
flowchartnya!
2. Modifikasi program di atas, sehingga Anda bisa melakukan entry data untuk 7 teman
Anda!
3. Jelaskan, mengapa ketika L2 di print, maka hasilnya akan sama dengan L1! Padahal
kita hanya melakukan entry data pada L1.

85
DAFTAR PUSTAKA

[1] Budiyanto, A., Algoritma dan Pemrograman, Ilmukomputer.com, 2003


[2] Eck, David J., Introduction to Programming Using Java, http://math.hws.edu/javanotes/,
2004
[3] Utami, E., Raharjo, S., Struktur Data Menggunakan C di GNU/Linux, Penerbit Andi,
Yogyakarta, 2004
[4] Wahono, R.S., Algoritma dalam Bahasa C, Ilmukomputer.com, 2003

86

Anda mungkin juga menyukai