Algoritma dan Struktur Data

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”

Transcript of Algoritma dan Struktur Data

Page 1: Algoritma dan Struktur Data

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”

Page 2: Algoritma dan Struktur Data

ii

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: [email protected]

Page 3: Algoritma dan Struktur Data

iii

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

Page 4: Algoritma dan Struktur Data

1

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.

Page 5: Algoritma dan Struktur Data

2

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 pembelajaran

: Waktu evaluasi : tengah dan akhir semester 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

Page 6: Algoritma dan Struktur Data

3

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 Umum

: Setelah mengikuti perkuliahan, mahasiswa akan dapat menjelaskan cara kerja sebuah program komputer 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 algoritma dan struktur data 1. Konsep algoritma dan struktur data Papan tulis, OHP

Ceramah, diskusi

1x100 menit

2 Mahasiswa mampu menjelaskan teknik

pemrograman menggunakan rekursi dan struktur data berantai

1. Rekursi

2. Pointer dan Linked objects 3. Stack dan queue 4. Binary tree

Papan tulis, OHP Ceramah,

diskusi, latihan, tugas

7x100 menit

3 Mahasiswa mampu menjelaskan teknik

generic programming dan pemrograman menggunakan sekumpulan class

1. Generic programming 2. List dan set classes 3. Map classes 4. Pemrograman menggunakan

collection class

Papan tulis, OHP

Ceramah,

diskusi, latihan, tugas

8x100 menit

Page 7: Algoritma dan Struktur Data

4

⇒ Materi Praktikum No. Tujuan Pembelajaran Khusus Substansi Materi Fasilitas Metode Waktu

[1] [2] [3] [4] [5] [6]

1 Mahasiswa mampu menerapkan teknik

pemrograman menggunakan rekursi dan struktur data berantai dalam

praktek menggunakan salah satu bahasa pemrograman

1. Rekursi

2. Linked objects (List) 3. Stack 4. queue 5. Binary tree 6. Implementasi List

Komputer,

Papan tulis

Praktikum 6x150 menit

Page 8: Algoritma dan Struktur Data

5

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 Umum

: Setelah mengikuti perkuliahan, mahasiswa akan dapat menjelaskan cara kerja sebuah program komputer berdasarkan algoritma dan struktur data yang digunakan.

1.4.1 Pertemuan 1 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan konsep algoritma dan struktur data

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 2. Menjelaskan peta kompetensi mata kuliah dan

tujuan pembelajaran 3. Menjelaskan rancangan pembelajaran 4. Memberikan daftar referensi mata kuliah

Menyimak Bertanya

Papan tulis OHP

20 menit

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

Page 9: Algoritma dan Struktur Data

6

No. Tahap Kegiatan Kegiatan Pengajar Kegiatan Mahasiswa Media & Alat Waktu

[1] [2] [3] [4] [5] [6]

2. Memaparkan definisi struktur data

3. Memaparkan konsep algoritma dan struktur data

4. Memberikan contoh penerapan algoritma dan struktur data dalam sebuah contoh pemecahan masalah nyata menggunakan program komputer

Bertanya

Menjawab pertanyaan

OHP

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 10: Algoritma dan Struktur Data

7

1.4.2 Pertemuan 2 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan definisi rekursi 2. Memaparkan kegunaan teknik rekursi 3. Memberikan contoh program yang

menggunakan teknik rekursi 4. Memberikan contoh soal teknik rekursi

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 11: Algoritma dan Struktur Data

8

1.4.3 Pertemuan 3 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian pointer 2. Memaparkan pengertian linked objects 3. Memaparkan penggunaan pointer & linked

objects 4. Memberikan contoh program yang

menggunakan linked objects

Menyimak

Bertanya Menjawab pertanyaan

Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 12: Algoritma dan Struktur Data

9

1.4.4 Pertemuan 4 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memberikan contoh soal mengenai penggunaan

linked objects 2. Memberikan tugas mandiri

Menyimak

Bertanya Mengerjakan soal

Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 13: Algoritma dan Struktur Data

10

1.4.5 Pertemuan 5 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya Mengumpulkan tugas

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan definisi stack 2. Memaparkan penggunaan stack 3. Memberikan contoh program yang

menggunakan stack 4. Memberikan contoh soal penggunaan stack

dalam sebuah program

Menyimak

Bertanya Menjawab pertanyaan

Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 14: Algoritma dan Struktur Data

11

1.4.6 Pertemuan 6 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan definisi queue 2. Memaparkan penggunaan queue 3. Memberikan contoh program yang

menggunakan queue 4. Memberikan contoh soal penggunaan queue

dalam sebuah program

Menyimak

Bertanya Menjawab pertanyaan

Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 15: Algoritma dan Struktur Data

12

1.4.7 Pertemuan 7 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian binary tree 2. Memaparkan penggunaan binary tree 3. Memberikan contoh program yang

menggunakan binary tree

Menyimak

Bertanya Menjawab pertanyaan

Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 16: Algoritma dan Struktur Data

13

1.4.8 Pertemuan 8 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik pemrograman menggunakan rekursi dan struktur data berantai

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memberikan contoh soal penggunaan binary tree dalam program

2. Memberikan tugas mandiri

Menyimak

Bertanya Menjawab pertanyaan

Mengerjakan soal Memberi umpan balik

Papan tulis

OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Mengingatkan mahasiswa agar mengadakan

persiapan menghadapi ujian tengah semester 3. Memberikan acuan-acuan lain yang perlu 4. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 17: Algoritma dan Struktur Data

14

1.4.9 Pertemuan 9 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Membahas jawaban soal ujian tengah semester

Menyimak Bertanya

Papan tulis OHP

30 menit

2 Penyajian 1. Memaparkan pengertian generic programming 2. Memaparkan implementasi generic

programming dalam berbagai bahasa pemrograman yang berbeda

3. Memaparkan klasifikasi struktur data generic

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

50 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 18: Algoritma dan Struktur Data

15

1.4.10 Pertemuan 10 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memberikan contoh program yang menggunakan teknik generic programming

2. Memberikan contoh soal penggunaan generic programming dalam program

Menyimak Bertanya Menjawab pertanyaan Mengerjakan soal Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 19: Algoritma dan Struktur Data

16

1.4.11 Pertemuan 11 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian list classes 2. Memaparkan klasifikasi list classes 3. Memaparkan contoh penggunaan list classes

dalam program

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 20: Algoritma dan Struktur Data

17

1.4.12 Pertemuan 12 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian set classes 2. Memaparkan perbedaan list dan set classes 3. Memaparkan contoh penggunaan set classes

dalam program (TreeSet dan HashSet)

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 21: Algoritma dan Struktur Data

18

1.4.13 Pertemuan 13 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian map classes 2. Memaparkan implementasi antarmuka map 3. Memaparkan pengertian Views, Subsets dan

SubMaps

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 22: Algoritma dan Struktur Data

19

1.4.14 Pertemuan 14 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian hash tables 2. Memberikan contoh program yang

menggunakan map classes 3. Memberikan contoh soal penggunaan map

classes dalam program

Menyimak Bertanya Menjawab pertanyaan Mengerjakan soal Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan

2. Memberikan acuan-acuan lain yang perlu 3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 23: Algoritma dan Struktur Data

20

1.4.15 Pertemuan 15 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 2. Mengulang materi pertemuan terakhir

Menyimak Bertanya

Papan tulis OHP

20 menit

2 Penyajian 1. Memaparkan pengertian pemrograman menggunakan collection classes

2. Memberikan contoh program yang menggunakan collection classes

Menyimak Bertanya Menjawab pertanyaan Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Menyimpulkan materi pertemuan 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis OHP

20 menit

Page 24: Algoritma dan Struktur Data

21

1.4.16 Pertemuan 16 Waktu : 100 menit

Tujuan Pembelajaran Khusus

: Mahasiswa mampu menjelaskan teknik generic programming dan pemrograman menggunakan collection classes

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 OHP

20 menit

2 Penyajian 1. Mengulas semua materi kuliah sejak pertemuan ke-9: generic programming, list and set classes, map classes dan collection classes

2. Memberikan contoh soal

Menyimak Bertanya Menjawab pertanyaan Mengerjakan soal Memberi umpan balik

Papan tulis OHP

60 menit

3 Penutup 1. Mengingatkan mahasiswa untuk

mempersiapkan ujian akhir 2. Memberikan acuan-acuan lain yang perlu

3. Menutup pertemuan

Menyimak Papan tulis

OHP

20 menit

Page 25: Algoritma dan Struktur Data

22

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

Page 26: Algoritma dan Struktur Data

23

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

Page 27: Algoritma dan Struktur Data

24

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.

Page 28: Algoritma dan Struktur Data

25

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.

Page 29: Algoritma dan Struktur Data

26

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;

{

Page 30: Algoritma dan Struktur Data

27

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.

Page 31: Algoritma dan Struktur Data

28

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

{

Page 32: Algoritma dan Struktur Data

29

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;

Page 33: Algoritma dan Struktur Data

30

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.

Page 34: Algoritma dan Struktur Data

31

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.

Page 35: Algoritma dan Struktur Data

32

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){

Page 36: Algoritma dan Struktur Data

33

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.

Page 37: Algoritma dan Struktur Data

34

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;

}

Page 38: Algoritma dan Struktur Data

35

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){

Page 39: Algoritma dan Struktur Data

36

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;

}

}

Page 40: Algoritma dan Struktur Data

37

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

}

Page 41: Algoritma dan Struktur Data

38

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

Page 42: Algoritma dan Struktur Data

39

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);

Page 43: Algoritma dan Struktur Data

40

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];

Page 44: Algoritma dan Struktur Data

41

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.

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

akhir=MAX

awal=1

Page 45: Algoritma dan Struktur Data

42

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)

Page 46: Algoritma dan Struktur Data

43

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”);

}

Page 47: Algoritma dan Struktur Data

44

6. Fungsi clear: digunakan untuk menghapus semua elemen queue. Operasinya sama

dengan fungsi inisialisasi.

Page 48: Algoritma dan Struktur Data

45

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

Page 49: Algoritma dan Struktur Data

46

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 );

}

}

Page 50: Algoritma dan Struktur Data

47

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

Page 51: Algoritma dan Struktur Data

48

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

Page 52: Algoritma dan Struktur Data

49

// 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

Page 53: Algoritma dan Struktur Data

50

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 + "\".");

Page 54: Algoritma dan Struktur Data

51

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());

Page 55: Algoritma dan Struktur Data

52

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) {

Page 56: Algoritma dan Struktur Data

53

info.put(name,number);

}

public String getNumber(String name)

{

return (String)info.get(name);

}

}

Page 57: Algoritma dan Struktur Data

54

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

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.

Gambar 1 Lima objek yang terkait.

Page 58: Algoritma dan Struktur Data

55

Penyisipan dengan insert after akan menambahkan elemen baru setelah suatu elemen,

dengan insert after kita bisa menambahkan elemen baru di tengah list.

Page 59: Algoritma dan Struktur Data

56

[ 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”.

Page 60: Algoritma dan Struktur Data

57

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!

Page 61: Algoritma dan Struktur Data

58

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.

Page 62: Algoritma dan Struktur Data

59

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

Page 63: Algoritma dan Struktur Data

60

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!

Page 64: Algoritma dan Struktur Data

61

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

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 ! ]

Gambar 2 Ilustrasi operasi push pada sebuah stack.

Page 65: Algoritma dan Struktur Data

62

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!).

Page 66: Algoritma dan Struktur Data

63

[ 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 :

Page 67: Algoritma dan Struktur Data

64

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

Page 68: Algoritma dan Struktur Data

65

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

Page 69: Algoritma dan Struktur Data

66

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

penghapusan elemen kita sebut dequeue. Enqueue akan memasukkan sebuah integer ke

dalam Queue dan dequeue akan menghapus nilai elemen terdepan (Head) dan

mengembalikan nilainya.

Gambar 3 Operasi penghapusan (dequeue) dan penambahan (enqueue) pada Queue.

Page 70: Algoritma dan Struktur Data

67

[ 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 :

Page 71: Algoritma dan Struktur Data

68

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

Page 72: Algoritma dan Struktur Data

69

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

Page 73: Algoritma dan Struktur Data

70

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:

Page 74: Algoritma dan Struktur Data

71

[ 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 ] }

Page 75: Algoritma dan Struktur Data

72

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.

Page 76: Algoritma dan Struktur Data

73

[ 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 !

Page 77: Algoritma dan Struktur Data

74

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

Page 78: Algoritma dan Struktur Data

75

[ 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 }

Page 79: Algoritma dan Struktur Data

76

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 :

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

1

4 3

5 2 6 7

9 8

Page 80: Algoritma dan Struktur Data

77

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.

Page 81: Algoritma dan Struktur Data

78

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;

Page 82: Algoritma dan Struktur Data

79

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.

Page 83: Algoritma dan Struktur Data

80

[ 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!

Page 84: Algoritma dan Struktur Data

81

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

nama

alamat

telepon

Integer (int)

String

String

String

Nomor identitas data buku telepon

Nama

Alamat

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.

Page 85: Algoritma dan Struktur Data

82

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 :

Page 86: Algoritma dan Struktur Data

83

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; }

Page 87: Algoritma dan Struktur Data

84

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++){

Page 88: Algoritma dan Struktur Data

85

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.

Page 89: Algoritma dan Struktur Data

86

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