Sunday, December 25, 2016

Bab 15. Visual Basic .NET Belajar Dari Contoh



15. Struktur Data







Pengantar

Struktur data yang telah dipelajari sejauh ini, seperti array subskript-tunggal dan array subskript-ganda, adalah struktur data berukuran tetap. Bab ini akan mengintroduksi struktur data dinamais, yang dapat bertumbuh dan menyusut pada saat eksekusi. Senarai berantai adalah koleksi item data, dimana pengguna dapat menyisipkan dan menghapus sembarang item di mana saja di dalam senarai tersebut. Tumpukan penting pada kompiler dan sistem operasi; penyisipan dan penghapusan hanya berlaku untuk item pada posisi paling atas tumpukan. Antrian merepresentasikan baris antrian; penyisipan hanya dilakukan di belakang (disebut juga dengan ekor) antrian, dan penghapusan hanya dilakukan di depan (disebut pula dengan kepala) antrian. Pohon biner memfasilitasi pencarian dan pengurutan kecepatan-tinggi, dimana di dalamnya dilakukan eliminasi efisien atas item-item data duplikat. Antrian merepresentasikan hirarki sistem-file dan kompilasi ekspresi menjadi bahasa mesin.

Pada bab ini, akan didiskusikan setiap tipe struktur data dan diimplementasikan beberapa program yang menciptakan dan memanipulasi setiap struktur data tersebut. Kelas, pewarisan, dan komposisi diciptakan sehingga dapat meningkatkan kapabilitas struktur data.


Kelas Referensi-Diri
Sebuah kelas referensi-diri memuat sebuah anggota referensi yang menunjuk ke suatu objek kelas yang memili tipe kelas yang sama. Sebagai contoh, definisi kelas pada kode 15.1 mendefinisikan tipe CSimpul. Tipe ini memiliki dua variabel instans Private (baris 5-6), Integer mData dan referensi CSimpul mSimpulBerikutnya. Anggota mSimpulBerikutnya mereferensi sebuah objek bertipe CSimpul, tipe yang sama dengan kelasnya. Jadi, istilah referensi-diri sangat tepat untuk kasus ini. Anggota mSimpulBerikutnya dikenal dengan sebuah link atau rantai (ini berarti bahwa mSimpulBerikutnya dapat dipakai untuk “merantai atau mengikat” sebuah objek bertipe CSimpul dengan objek lain bertipe sama). Kelas CSimpul juga memiliki dua properti: satu untuk variabel mData, dinamai Data (baris 13-23), dan yang lain untuk variabel mSimpulBerikutnya, dinamai SimpulBerikutnya (baris 26-36).

Objek referensi-diri dapat dirantai atau dihubungkan bersama untuk membentuk struktur data, seperti senarai, antrian, tumpukan, dan pohon. Gambar 15.1 mengilustrasikan pengikatan dua objek referensi-diri untuk membentuk sebuah senarai. Garis-miring (backslash) \, yang merepresentasikan referensi Nothing), ditempatkan pada anggota dari objek referensi-diri kedua bertujuan untuk mengindikasikan bahwa link atau rantai tidak menunjuk ke objek lain. Referensi Nothing biasanya mendefinisikan akhir sebuah struktur data.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
' Kode 15.1: Simpul.vb
' Kelas Simpul referensi-diri.

Class CSimpul
    Private mData As Integer
    Private mSimpulBerikutnya As CSimpul

    Public Sub New(ByVal nilaiData As Integer)
        ' tubuh konstruktor
    End Sub ' New

    ' Properti Data
    Public Property Data() As Integer

        Get
            ' tubuh Get
        End Get

        Set(ByVal nilaiData As Integer)
            ' tubuh Set
        End Set

    End Property ' Data

    ' Properti SimpulBerikutnya
    Public Property SimpulBerikutnya() As CSimpul

        Get
            ' mendapatkan simpul berikutnya
        End Get

        Set(ByVal nilaiSimpul As CSimpul)
            ' menetapkan simpul berikutnya
        End Set

    End Property ' SimpulBerikutnya

End Class 'CSimpul


Gambar 15.1 Dua objek kelas referensi-diri dirantai atau dihubungkan bersama


Penciptaan struktur data dinamis memerlukan alokasi memori dinamis, yaitu kemampuan program untuk mendapatkan memori tambahan (untuk menampung variabel-variabel baru) dan untuk melepaskan memori yang sudah tidak lagi dibutuhkan pada saat eksekusi. Ingat bahwa program Visual Basic secara otomatis melakukan koleksi sampah memori.

Katakunci New penting dalam alokasi memori dinamis. Katakunci New mengambil nama kelas suatu objek sebagai operand. Ia kemudian secara dinamis mengalokasikan memori untuk objek yang baru, memanggil konstruktor kelas, dan menghasilkan sebuah referensi yang menunjuk ke objek yang baru saja diciptakan. Sebagai contoh, statemen:

Dim simpulYgAkanDitambahkan As CSimpul = New CSimpul(10)

mengalokasikan sejumlah memori tertentu untuk menyimpan sebuah CSimpul, memanggil konstruktor CSimpul dengan argumen 10 (untuk anggota mData pada CSimpul), dan menyimpan sebuah referensi yang menunjuk ke objek ini di dalam simpulYgAkanDitambahkan.

Beberapa topik ke depan akan mendiskusikan senarai, tumpukan, antrian, dan pohon. Semua struktur data tersebut diciptakan dan dikembangkan dengan alokasi memori dinamis dan kelas referensi-diri.


Senarai Berantai
Senarai berantai adalah sebuah koleksi linier (runtun) atas objek-objek kelas referensi-diri, yang dinamakan dengan simpul, yang dikoneksi oleh rantai-rantai referensi. Program dapat mengakses sebuah senarai berantai melalui referensi yang menunjuk ke simpul pertama pada senarai. Setiap simpul diakses via anggota referensi pada simpul sekarang. Secara konvensi, referensi pada simpul terakhir ditetapkan menjadi Nothing untuk menandai akhir senarai. Data disimpan pada sebuah senarai berantai secara dinamis, dimana setiap simpul diciptakan jika diperlukan. Simpul dapat memuat sembarang tipe data.

Meskipun array juga dapat menyimpan koleksi data, senarai berantai memberikan beberapa keuntungan dan keunggulan lebih. Sangat tepat untuk menggunakan senarai berantai apabila jumlah elemen data yang akan disajikan pada struktur data tidak dapat diprediksi. Tidak seperti senarai berantai, ukuran dari array Visual Basic konvensional tidak dapat diubah, karena ukuran array tetap ketika array diciptakan. Array konvensional bisa menjadi penuh, tetapi senarai berantai hanya bisa penuh ketika sistem tidak lagi mempunyai memori untuk memenuhi permintaan pengalokasian dinamis.

Programer dapat mengembangkan senarai berantai secara berurutan hanya dengan menyisipkan setiap elemen baru pada titik yang tepat di dalam senarai. Jadi, penyisipan elemen baru tidak menyebabkan pemindahan elemen-elemen yang sudah ada.

Normalnya, memori tidak menyimpan simpul-simpul senarai berantai secara bertetangga di dalam memori. Gambar 15.2 mengilustrasikan sebuah senarai berantai yang memuat beberapa simpul.


Gambar 15.2 Representasi grafikal atas senarai berantai


Program pada kode 15.2-15.4 menggunakan sebuah objek kelas CSenarai untuk memanipulasi sekumpulan objek bertipe Object. Metode Main pada module modUjiSenarai (Kode 15.5) menciptakan beberapa objek, menyisipkan objek di awal senarai (menggunakan metode CSenarai SisipDiDepan), menyisipkan objek di akhir senarai (menggunakan metode CSenarai SisipDiBelakang), menghapus objek dari depan senarai (menggunakan metode CSenarai HapusDariDepan), dan menghapus objek dari belakang senarai (menggunakan metode CSenarai HapusDariBelakang). Setiap operasi penyisipan atau penghapusan akan memanggil metode CSenarai Tampil untuk menampilkan isi senarai sekarang. Diskusi detil atas program akan diberikan. Sebuah EksepsiSenaraiKosong terjadi jika percobaan untuk menghapus sebuah item dari senarai kosong dilakukan.

Program memuat empat kelas, CSimpulSenarai (kode 15.2), CSenarai (kode 15.3), EksepsiSenaraiKosong (kode 15.4), dan module modUjiSenarai (kode 15.5). Kelas-kelas pada kode 15.2-15.4 menciptakan sebuah pustaka senarai-berantai. Ketiga kelas tersebut berada di dalam namespace LinkedListLibrary.

Terenkapsulasi di dalam tiap objek CSenarai adalah sebuah senarai berantai yang memuat objek-objek CSimpulSenarai. Kelas CSimpulSenarai (kode 15.2) memuat dua variabel anggota, mData dan mSimpulBerikutnya. Anggota mData dapat menunjuk ke sembarang Object. Anggota mSimpulBerikutnya menyimpan sebuah referensi yang menunjuk ke objek CSimpulSenarai berikutnya pada senarai berantai. Sebuah CSenarai mengakses variabel-variabel anggota CSimpulSenarai melalui properti Data (baris 22-28) dan SimpulBerikutnya (baris 31-41).

Kelas CSenarai (kode 15.3) memuat anggota-anggota Private simpulPertama (sebuah referensi yang menunjuk ke CSimpulSenarai pertama pada sebuah CSimpul) dan simpulAkhir (sebuah referensi yang menunjuk ke CSimpulSenarai terakhir pada sebuah CSimpul). Konstruktor (baris 10-14 dan 17-19) menginisialisasi kedua referensi menjadi Nothing. Metode SisipDiDepan (baris 22-36), SisipDiBelakang (baris 39-54), HapusDariDepan (baris 57-81), dan HapusDari-Belakang (baris 84-117) adalah metode-metode utama pada kelas CSenarai. Setiap metode menggunakan blok SyncLock untuk memastikan bahwa objek-objek CSenarai menjadi multithread safe.

Metode ApaKosong (baris 120-132) adalah metode predikat yang menentukan apakah senarai kosong (apakah referensi ke simpul pertama senarai adalah Nothing). Metode predikat secara umum menguji sebuah kondisi dan tidak memodifikasi objek. Jika senarai kosong, metode ApaKosong menghasilkan True; sebaliknya, ia menghasilkan False. Metode Tampil (baris 135-159) menampilkan isi senarai. Kedua metode ApaKosong dan metode Tampil menggunakan blok SyncLock untuk memastikan bahwa keadaan senarai tidak berubah ketika metode-metode tersebut melakukan tugasnya.

Kelas EksepsiSenaraiKosong (kode 15.4) mendefinisikan sebuah kelas eksepsi untuk menangani operasi-operasi ilegal pada CSenarai yang kosong. Sebagai contoh, sebuah EksepsiSenarai-Kosong terjadi jika program mencoba menghapus sebuah simpul dari CSenarai yang kosong.

Module modUjiSenarai (kode 15.5) menggunakan pustaka senarai-berantai untuk menciptakan dan memanipulasi sebuah senarai berantai. Baris 10 menciptakan sebuah instans bertipe CSenarai, dinamai senarai. Kemudian, baris 13-16 menciptakan data yang akan ditambahkan ke dalam senarai. Baris 19-29 menggunakan metode-metode penyisipan CSenarai untuk menyisipkan objek-objek dan menggunakan metode CSenarai Tampil untuk menampilkan isi senarai setelah tiap penyisipan dilakukan. Kode di dalam blok Try (baris 35-70) menghapus objek-objek (menggunakan metode-metode penghapusan CSenarai), menampilkan objek yang dihapus, dan menampilkan isi senarai setelah setiap penghapusan dilakukan. Jika terdapat percobaan untuk menghapus sebuah objek dari senarai kosong, maka blok Catch (baris 68-69) akan menangkap EksepsiSenaraiKosong. Perhatikan bahwa module modUjiSenarai menggunakan namespace LinkedListLibrary. Jadi, projek yang memuat module modUjiSenarai harus memuat sebuah referensi yang menunjuk ke pustaka kelas LinkedListLibrary.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
' Kode 15.2: SimpulSenarai.vb
' Kelas untuk merepresentasikan satu simpul di dalam sebuah CSenarai.

Public Class CSimpulSenarai
    Private mData As Object
    Private mSimpulBerikutnya As CSimpulSenarai

    ' menciptakan CSimpulSenarai dengan nilaiData dalam senarai
    Public Sub New(ByVal nilaiData As Object)
        MyClass.New(nilaiData, Nothing)
    End Sub ' New

    ' menciptakan CSimpulSenarai, nilaiData dan nilaiSimpulBerikutnya dalam senarai
    Public Sub New(ByVal nilaiData As Object, _
        ByVal nilaiSimpulBerikutnya As Object)

        mData = nilaiData
        mSimpulBerikutnya = nilaiSimpulBerikutnya
    End Sub ' New

    ' properti Data
    Public ReadOnly Property Data() As Object

        Get
            Return mData
        End Get

    End Property ' Data

    ' properti mSimpulBerikutnya
    Public Property SimpulBerikutnya() As CSimpulSenarai

        Get
            Return mSimpulBerikutnya
        End Get

        Set(ByVal nilai As CSimpulSenarai)
            mSimpulBerikutnya = nilai
        End Set

    End Property ' SimpulBerikutnya

End Class ' CSimpulSenarai

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
' Kode 15.3: Senarai.vb
' Definisi kelas CSenarai.

Public Class CSenarai
    Private simpulPertama As CSimpulSenarai
    Private simpulAkhir As CSimpulSenarai
    Private nama As String

    ' menciptakan Senarai kosong dengan nama tertentu
    Public Sub New(ByVal namaSenarai As String)
        nama = namaSenarai
        simpulPertama = Nothing
        simpulAkhir = Nothing
    End Sub ' New

    ' menciptakan Senarai kosong dengan "senarai" sebagai namanya
    Public Sub New()
        MyClass.New("senarai")
    End Sub ' New

    ' menyisipkan objek di depan Senarai
    Public Sub SisipDiDepan(ByVal itemSisip As Object)

        SyncLock (Me) ' memastikan thread safe

            ' jika senarai kosong, ciptakan simpul
            If ApaKosong() Then
                simpulAkhir = New CSimpulSenarai(itemSisip)
                simpulPertama = simpulAkhir
            Else ' menciptakan simpul dan menyisipkannya sebelum simpul pertama
                simpulPertama = New CSimpulSenarai(itemSisip, simpulPertama)
            End If

        End SyncLock

    End Sub ' SisipDiDepan

    ' menyisipkan objek di belakang Senarai
    Public Sub SisipDiBelakang(ByVal itemSisip As Object)

        SyncLock (Me) ' memastikan thread safety

            ' jika senarai kosong, ciptakan simpul dan tetapkan simpulPertama
            If ApaKosong() Then
                simpulAkhir = New CSimpulSenarai(itemSisip)
                simpulPertama = simpulAkhir
            Else ' menciptakan simpul dan menyisipkannya setelah simpul akhir
                simpulAkhir.SimpulBerikutnya = New CSimpulSenarai(itemSisip)
                simpulAkhir = simpulAkhir.SimpulBerikutnya
            End If

        End SyncLock

    End Sub ' SisipDiBelakang

    ' menghapus simpul pertama dari Senarai
    Public Function HapusDariDepan() As Object

        SyncLock (Me) ' memastikan thread safety
            Dim itemHapus As Object = Nothing

            ' melempar eksepsi jika mencoba menghapus senarai kosong
            If ApaKosong() Then
                Throw New EksepsiSenaraiKosong(nama)
            End If

            itemHapus = simpulPertama.Data ' mengambil data

            ' mereset referensi simpulPertama dan simpulAkhir
            If simpulPertama Is simpulAkhir Then
                simpulPertama = Nothing
                simpulAkhir = Nothing
            Else
                simpulPertama = simpulPertama.SimpulBerikutnya
            End If

            Return itemHapus ' menghasilkan item yang dihapus

        End SyncLock

    End Function ' HapusDariDepan

    ' menghapus simpul akhir dari Senarai
    Public Function HapusDariBelakang() As Object

        SyncLock (Me) ' memastikan thread safe
            Dim itemHapus As Object = Nothing

            ' melempar eksepsi jika mencoba menghapus senarai kosong
            If ApaKosong() Then
                Throw New EksepsiSenaraiKosong(nama)
            End If

            itemHapus = simpulAkhir.Data ' mengambil data

            ' mereset referensi simpulPertama dan simpulAkhir
            If simpulPertama Is simpulAkhir Then
                simpulAkhir = Nothing
                simpulPertama = simpulAkhir
            Else
                Dim sekarang As CSimpulSenarai = simpulPertama

                ' loop while simpul sekarang bukan simpulAkhir
                While (Not (sekarang.SimpulBerikutnya Is simpulAkhir))
                    sekarang = sekarang.SimpulBerikutnya ' ke simpul berikutnya
                End While

                ' sekarang adalh simpulAkhir yang baru
                simpulAkhir = sekarang
                sekarang.SimpulBerikutnya = Nothing
            End If

            Return itemHapus ' menghasilkan item yang dihapus

        End SyncLock

    End Function ' HapusDariBelakang

    ' menghasilkan true jika senarai kosong
    Public Function ApaKosong() As Boolean

        SyncLock (Me)

            If simpulPertama Is Nothing Then
                Return True
            Else
                Return False
            End If

        End SyncLock

    End Function ' ApaKosong

    ' menampilkan isi Senarai
    Public Overridable Sub Tampil()

        SyncLock (Me)

            If ApaKosong() Then
                Console.WriteLine("Kosong " & nama)

                Return
            End If

            Console.Write("# " & nama & " adalah: ")

            Dim sekarang As CSimpulSenarai = simpulPertama

            ' menampilkan data simpul sekarang ketika tidak di akhir senarai
            While Not sekarang Is Nothing
                Console.Write(sekarang.Data & " ")
                sekarang = sekarang.SimpulBerikutnya
            End While

            Console.WriteLine(vbCrLf)

        End SyncLock

    End Sub ' Tampil

End Class ' CSenarai

1
2
3
4
5
6
7
8
9
10
11
' Kode 15.4: EksepsiSenaraiKosong.vb
' Definisi kelas EksepsiSenaraiKosong.

Public Class EksepsiSenaraiKosong
    Inherits ApplicationException

    Public Sub New(ByVal nama As String)
        MyBase.New("# " & nama & " adalah kosong")
    End Sub ' New

End Class ' EksepsiSenaraiKosong

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
' Gambar 15.5: UjiSenarai.vb
' Menguji kelas CSenarai.

' Program ini dapat dikembangkan oleh para mahasiswa
' untuk berbagai aplikasi di dunia nyata.

Module modUjiSenarai

    Sub Main()
        Dim senarai As CSenarai = New CSenarai() ' menciptakan kontainer CSenarai

        ' menciptakan data untuk menyimpan di dalam CSenarai
        Dim aBoolean As Boolean = True
        Dim aKarakter As Char = "$"c
        Dim anInteger As Integer = 34567
        Dim aString As String = "hallo"

        ' menggunakan metode-metode penyisipan CSenarai
        senarai.SisipDiDepan(aBoolean) ' menyisipkan Boolean di depan
        senarai.Tampil()

        senarai.SisipDiDepan(aKarakter) ' menyisipkan Char di depan
        senarai.Tampil()

        senarai.SisipDiBelakang(anInteger) ' menyisipkan Integer di belakang
        senarai.Tampil()

        senarai.SisipDiBelakang(aString) ' menyisipkan String di belakang
        senarai.Tampil()

        ' menggunakan metode-metode penghapusan CSenarai
        Dim objekHapus As Object

        ' menghapus data dari senarai dan menampilkan setiap penghapusan
        Try

            ' menghapus objek dari depan senarai
            objekHapus = senarai.HapusDariDepan()
            Console.WriteLine(Convert.ToString(objekHapus) & _
            " dihapus")

            senarai.Tampil()

            ' menghapus objek dari depan senarai
            objekHapus = senarai.HapusDariDepan()
            Console.WriteLine(Convert.ToString(objekHapus) & _
            " dihapus")

            senarai.Tampil()

            ' menghapus objek dari belakang senarai
            objekHapus = senarai.HapusDariBelakang()
            Console.WriteLine(Convert.ToString(objekHapus) & _
             " dihapus")

            senarai.Tampil()

            ' menghapus objek dari belakang senarai
            objekHapus = senarai.HapusDariBelakang()
            Console.WriteLine(Convert.ToString(objekHapus) & _
            " dihapus")

            senarai.Tampil()

            ' menangkap eksepsi jika senarai kosong
        Catch eksepsiSenaraiKosong As EksepsiSenaraiKosong
            Console.Error.WriteLine(vbCrLf & _
            Convert.ToString(eksepsiSenaraiKosong))

        End Try

    End Sub ' Main

End Module ' modUjiSenarai

# senarai adalah: True

# senarai adalah: $ True

# senarai adalah: $ True 34567

# senarai adalah: $ True 34567 hallo

$ dihapus
# senarai adalah: True 34567 hallo

True dihapus
# senarai adalah: 34567 hallo

hallo dihapus
# senarai adalah: 34567

34567 dihapus
senarai kosong

Pada beberapa halaman ke depan, akan didisikusikan setiap metode dari kelas CSenarai secara detil. Metode SisipDiDepan (kode 15.3, baris 22-36) menempatkan sebuah simpul baru di depan senarai. Metode ini terdiri-dari tiga langkah, yang dapat dijelaskan berikut:
1.       Memanggil ApaKosong untuk menentukan apakah senarai kosong (kode 15.3, baris 27).

2.       Jika senarai kosong, kedua simpulPertama dan simpulAkhir ditetapkan untuk menunjuk ke CSimpulSenarai yang baru yang diinisialisasi dengan objek itemSisip (baris 28-29). Konstruktor CSimpulSenarai pada baris 9-11 (kode 15.2) memanggil konstruktor CSimpulSenarai  pada baris 14-19 (kode 15.2) untuk menetapkan variabel instans mData untuk menunjuk ke Object yang dilewatkan sebagai argumen pertama dan kemudian menetapkan mSimpulBerikutnya untuk menunjuk ke Nothing.

3.       Jika senarai tidak kosong, maka simpul baru dirantaikan ke dalam senarai dengan menetapkan simpulPertama agar menunjuk ke objek CSimpulSenarai yang baru, yang diinisialisasi dengan objek itemSisip dan simpulPertama (baris 30). Ketika konstruktor CSimpulSenarai (baris 14-19 pada kode 15.2) dieksekusi, ia akan menetapkan variabel instans mData agar menunjuk ke Object yang dilewatkan sebagai argumen pertama dan melakukan penyisipan dengan menetapkan referensi mSimpulBerikutnya agar menunjuk ke CSimpulSenarai yang dilewatkan sebagai argumen kedua.

Gambar 15.3 mengilustrasikan metode SisipDiDepan. Bagian a) menggambarkan senarai dan simpul baru selama operasi SisipDiDepan dan sebelum perantaian SimpulSenarai yang baru (memuat nilai 12) ke dalam senarai. Anak panah putus-putus pada bagian b) mengilustrasikan langkah 3 pada operasi SisipDiDepan, yang membuat SimpulSenarai menjadi bagian depan senarai yang baru.



Gambar 15.3 Representasi grafikal atas SisipDiDepan


Metode SisipDiBelakang (Kode 15.3, baris 39-54) menempatkan sebuah simpul baru di belakang senarai. Metode ini memuat tiga langkah:
1.       Memanggil ApaKosong untuk menentukan apakah senarai kosong (kode 15.3, baris 44).

2.       Jika senarai kosong, kedua simpulPertama dan simpulAkhir ditetapkan untuk menunjuk ke CSimpulSenarai yang baru yang diinisialisasi dengan objek itemSisip (baris 45-46). Konstruktor CSimpulSenarai pada baris 9-11 (kode 15.2) memanggil konstruktor CSimpulSenarai  pada baris 14-19 (kode 15.2) untuk menetapkan variabel instans mData untuk menunjuk ke Object yang dilewatkan sebagai argumen pertama dan kemudian menetapkan mSimpulBerikutnya untuk menunjuk ke Nothing.

3.       Jika senarai tidak kosong, maka simpul baru dirantaikan ke dalam senarai dengan menetapkan simpulAkhir dan simpulAkhir.SimpulBerikutnya agar menunjuk ke objek CSimpulSenarai yang baru, yang diinisialisasi dengan objek itemSisip (baris 48-49). Ketika konstruktor CSimpulSenarai (baris 9-11 pada kode 15.2) dieksekusi, ia akan menetapkan variabel instans mData agar menunjuk ke Object yang dilewatkan sebagai argumen dan melakukan penyisipan dengan menetapkan referensi mSimpulBerikutnya agar menunjuk ke Nothing.

Gambar 15.4 mengilustrasikan metode SisipDiBelakang. Bagian a) menggambarkan senarai dan SimpulSenarai yang baru (yang memuat nilai 5) selama operasi SisipDiBelakang dan sebelum perantaian simpul yang baru tersebut ke dalam senarai. Anak panah putus-putus pada bagian b) mengilustrasikan langkah-langkah pada operasi SisipDiBelakang, yang membuat SimpulSenarai menjadi bagian belakang senarai yang baru.

Metode HapusDariDepan (kode 15.3, baris 57-81) menghapus simpul depan dari senarai dan menghasilkan (menjadikan nilai balik) sebuah referensi yang menunjuk ke data terhapus. Metode ini melemparkan EksepsiSenaraiKosong (baris 63) jika program mencoba menghapus sebuah simpul dari senarai kosong. Metode ini memuat empat langkah:



Gambar 15.4 Representasi grafikal atas SisipDiBelakang


1.       Menugaskan simpulPertama.Data (data yang akan dihapus dari senarai) kepada referensi itemHapus (baris 67).

2.       Jika objek-objek yang ditunjuk oleh simpulPertama dan simpulAkhir adalah objek yang sama, maka ini mengindikasikan bahwa senarai hanya memuat satu elemen saja sebelum operasi penghapusan dilakukan. Pada kasus ini, metode HapusDariDepan menetapkan simpulPertama dan simpulAkhir menjadi Nothing (baris 71-72) untuk menghapus simpul dari senarai (sehingga senarai menjadi kosong).

3.       Jika senarai memuat lebih dari satu simpul sebelum penghapusan, maka metode ini membiarkan simpulAkhir seperti adanya dan hanya menugaskan simpulPertama.Sim-pulBerikunya untuk menunjuk ke simpulPertama (baris 77). Jadi, simpulPertama mereferensi simpul kedua sebelum pemanggilan metode HapusDariDepan.

4.       Menghasilkan referensi itemHapus (baris 77).

Gambar 15.5 mengilustrasikan metode HapusDariDepan. Bagian a) mengilustrasikan senarai sebelum operasi penghapusan. Bagian b) memotret manipulasi referensi yang terjadi.

Metode HapusDariBelakang (kode 15.3, baris 84-117) menghapus simpul akhir pada sebuah senarai dan menghasilkan sebuah referensi yang menunjuk ke data terhapus. Metode ini melemparkan EksepsiSenaraiKosong (baris 91) jika program mencoba menghapus sebuah simpul dari senarai kosong. Metode ini terdiri-dari tujuh langkah:
1.       Menugaskan simpulAkhir.Data (data yang akan dihapus dari senarai) kepada referensi itemHapus (baris 94).

2.       Jika objek-objek yang ditunjuk oleh simpulPertama dan simpulAkhir adalah objek yang sama (baris 97), maka ini mengindikasikan bahwa senarai hanya memuat satu elemen saja sebelum operasi penghapusan dilakukan. Pada kasus ini, metode HapusDariBelakang menetapkan simpulPertama dan simpulAkhir menjadi Nothing (baris 98-99) untuk menghapus simpul dari senarai (sehingga senarai menjadi kosong).



Gambar 15.5 Representasi grafikal atas HapusDariDepan



Gambar 15.6 Representasi grafikal atas HapusDariBelakang


3.       Jika senarai memuat lebih dari satu simpul sebelum penghapusan, maka diciptakan referensi CSimpulSenarai, sekarang, dan menugasinya simpulPertama (baris 101).

4.       Menggunakan sekarang untuk menjelajahi senarai sampai sekarang mereferensi simpul yang secara langsung berada tepat sebelum simpul akhir. Loop While (baris 104-106) menugaskan sekarang.SimpulBerikutnya untuk mereferensi sekarang asalkan sekarang.SimpulBerikutnya tidak sama dengan simpulAkhir.

5.       Setelah mengetahui lokasi simpul kedua terakhir, dilakukan penugasan sekarang kepada simpulAkhir (baris 109) untuk menghapus simpul akhir dari senarai.

6.        Menetapkan sekarang.SimpulBerikutnya menjadi Nothing (baris 110) pada simpul akhir yang baru.

7.       Menghasilkan referensi itemHapus (baris 113).


Tumpukan
Tumpukan adalah versi terkekang dari sebuah senarai berantai, dimana simpul baru dapat ditambahkan pada dan dihapus dari tumpukan hanya dari atasnya. Karena alasan ini, tumpukan disebuah dengan struktur data LIFO (least-in, first-out). Anggota link pada simpul bawah tumpukan ditetapkan menjadi Nothing untuk mengindikasikan bagian bawah tumpukan.

Beberapa operasi utama yang digunakan untuk memanipulasi tumpukan adalah push dan pop. Operasi push menambahkan sebuah simpul baru di atas tumpukan. Operasi pop menghapus sebuah simpul dari atas tumpukan dan menjadikan data dari simpul yang terhapus sebagai nilai balik.

Tumpukan memiliki banyak aplikasi. Sebagai contoh, ketika program memanggil sebuah metode, metode terpanggil harus mengetahui bagaiman kembali kepada pemanggilnya, sehingga alamat kembali ditempatkan di atas tumpukan eksekusi program. Jika serangkaian pemanggilan metode terjadi, alamat-alamat kembali ditempatkan ke atas tumpukan deengan gaya LIFO sehingga setiap metode dapat kembali kepada pemanggilnya.

Relasi yang dekat antara senarai dan tumpukan akan dipakai untuk mengimplementasikan kelas tumpukan dengan mendaur-ulang kelas senarai. Dua bentuk pendaur-ulangan kode akan didemons-trasikan. Pertama, akan diimplementasikan kelas tumpukan dengan mewarisi kelas CSenarai pada kode 15.3. Kemudian, akan diimplementasikan kelas tumpukan yang identik melalui komposisi dengan menyertakan objek CSenarai sebagai anggota Private dari kelas tumpukan.

Program pada kode 15.6 dan kode 15.7 menciptakan sebuah kelas tumpukan dengan mewarisi kelas CSenarai pada kode 15.3. Diinginkan bahwa tumpukan menyediakan metode Push, Pop, ApaKosong, dan Tampil. Secara esensial, semuanya adalah metode SisipDiDepan, HapusDariDepan, ApaKosong, dan Tampil dari kelas Senarai. Kelas Senarai memiliki beberapa metode lain, seperti SisipDiBelakang dan HapusDariBelakang, yang tidak bisa diakses melalui antarmuka Public pada tumpukan. Ingat bahwa semua metode pada antarmuka Public pada kelas CSenarai adalah metode Public pada kelas terderivasi CPewarisanTumpukan (kode 15.6).

Ketika metode-metode tumpukan diimplementasikan, setiap metode CPewarisanTumpukan memanggil metode CSenarai yang sesuai, yaitu metode Push memanggil SisipDiDepan dan metode Pop memanggil HapusDariDepan. Kelas CPewarisanTumpukan  tidak mendefinisikan metode ApaKosong dan Tampil, karena CPewarisanTumpukan mewarisi kedua metode ini dari kelas CSenarai. Semua metode pada kelas CPewarisanTumpukan tidak menggunakan statemen SyncLock. Setiap metode pada kelas ini memanggil metode dari kelas CSenarai yang menggunakan SyncLock.

Module metode Main pada modUjiPewarisanTumpukan (kode 15.7) menggunakan kelas CPewarisanTumpukan untuk menginstansiasi sebuah tumpukan Object, dinamai tumpukan. Baris 15-18 mendefinisikan empat objek yang akan ditempatkan ke atas tumpukan dan dihapus dari tumpukan. Program menempatkan sebuah Boolean dengan nilai True, sebuah Char dengan nilai $, sebuah Integer dengan nilai 34567, dan sebuah String dengan nilai “hallo” ke atas tumpukan (baris 21, 24, 27, dan 30). Loop While tak-hingga (baris 40-44) menghapus elemen-elemen tersebut dari tumpukan. Ketika tidak ada lagi objek yang akan dihapus, metode Pop melempar Eksepsi-SenaraiKosong, dan program menampilkan jejak tumpukan eksepsi, yang menggambarkan tumpukan eksekusi program ketika eksepsi terjadi. Program menggunakan metode Tampil (diwarisi dari kelas CSenarai) untuk menampilkan isi tumpukan setelah tiap operasi dilakukan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
' Kode 15.6: PewarisanTumpukan.vb
' Mengimplementasikan sebuah tumpukan dengan mewarisi kelas CSenarai.

‘ Metode Push memanggil metode SisipDiDepan
‘ Metode Pop memanggil metode HapusDariDepan

' kelas CPewarisanTumpukan mewarisi kelas CSenarai
Public Class CPewarisanTumpukan
    Inherits CSenarai

    ' melewatkan nama "tumpukan" kepada konstruktor CSenarai
    Public Sub New()
        MyBase.New("tumpukan")
    End Sub ' New

    ' menempatkan nilaiData di atas tumpukan dengan menyisipkan nilaiData
    ' di depan senarai berantai
    Public Sub Push(ByVal nilaiData As Object)
        MyBase.SisipDiDepan(nilaiData)
    End Sub ' Push

    ' menghapus item dari atas tumpukan dengan menghapus item yang ada di depan
    ' senarai berantai
    Public Function Pop() As Object
        Return MyBase.HapusDariDepan()
    End Function ' Pop

End Class ' CPewarisanTumpukan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' Kode 15.7: UjiPewarisanTumpukan.vb
' Menguji implementasi tumpukan.

‘ menempatkan beberapa item pada tumpukan dan
‘ menghapus item-item tersebut dari tumpukan


' demonstrasi fungsionalitas implementasi tumpukan
Module modUjiPewarisanTumpukan

    Sub Main()
        Dim tumpukan As CPewarisanTumpukan = New CPewarisanTumpukan()

        ' menciptakan objek-objek untuk disimpan pada tumpukan
        Dim aBoolean As Boolean = True
        Dim aKarakter As Char = Convert.ToChar("$")
        Dim anInteger As Integer = 34567
        Dim aString As String = "hallo"

        ' menggunakan metode Push untuk menambahkan item-item pada tumpukan
        tumpukan.Push(aBoolean) ' menambahkan Boolean
        tumpukan.Tampil()

        tumpukan.Push(aKarakter) ' menambahkan Char
        tumpukan.Tampil()

        tumpukan.Push(anInteger) ' menambahkan Integer
        tumpukan.Tampil()

        tumpukan.Push(aString) ' menambahkan String
        tumpukan.Tampil()

        ' menggunakan metode Pop untuk menghapus item-item dari tumpukan
        Dim objekDihapus As Object = Nothing

        ' menghapus item-item dari tumpukan
        Try

            ' menghapus item dan menampilkan item terhapus
            While True
                objekDihapus = tumpukan.Pop()
                Console.WriteLine(objekDihapus & " dihapus")
                tumpukan.Tampil()
            End While

            ' menangkap eksepsi jika Pop dipanggil ketika tumpukan kosong
        Catch eksepsiSenaraiKosong As EksepsiSenaraiKosong
            Console.Error.WriteLine(eksepsiSenaraiKosong.StackTrace)
        End Try

    End Sub ' Main

End Module ' modUjiPewarisanTumpukan

# tumpukan adalah: True

# tumpukan adalah: $ True

# tumpukan adalah: 34567 $ True

# tumpukan adalah: hallo 34567 $ True

hallo dihapus
# tumpukan adalah: 34567 $ True

34567 dihapus
# tumpukan adalah: $ True

$ dihapus
# tumpukan adalah: True

True dihapus

Kosong tumpukan
   at ConsoleApplication53.CSenarai.HapusDariDepan() in E:\CSenarai.vb:line 65
   at CPewarisanTumpukan.Pop() in E:\CPewarisanTumpukan.vb:line 22
   at modUjiPewarisanTumpukan.Main() in E:\modUjiPewarisanTumpukan.vb:line 38

Cara lain dalam mengimplementasikan sebuah kelas tumpukan adalah dengan mendaur-ulang kelas senarai melalui komposisi. Kelas pada 15.8 menggunakan sebuah objek Private dari kelas CSenarai (baris 9) di dalam definisi kelas CKomposisiTumpukan. Komposisi memampukan Anda untuk menyembunyikan metode-metode kelas CSenarai yang tidak perlu muncul di dalam antarmuka Public tumpukan. Hal ini dilakukan dengan menyediakan antarmuka Public bagi metode-metode yang diperlukan oleh metode-metode CSenarai. Kelas CKomposisiTumpukan mengimplemen-tasikan setiap metode tumpukan dengan mendelgasikan pekerjaanya kepada metode CSenarai yang sesuai. Kelas CKomposisiTumpukan memanggil metode-metode CSenarai, seperti SisipDi-Depan, HapusDariDepan, ApaKosong, dan Tampil.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
' Kode 15.8: KomposisiTumpukan.vb
' Definisi KomposisiTumpukan dengan objek CSenarai terkomposisi.

‘ menempatkan beberapa item pada tumpukan dan
‘ menghapus item-item tersebut dari tumpukan

' kelas CKomposisiTumpukan mengenkapsulasi kapabilitas CSenarai
Public Class CKomposisiTumpukan
    Private tumpukan As CSenarai

    ' menciptakan tumpukan kosong
    Public Sub New()
        tumpukan = New CSenarai("tumpukan")
    End Sub ' New

    ' menambahkan objek ke tumpukan
    Public Sub Push(ByVal nilaiData As Object)
        tumpukan.SisipDiDepan(nilaiData)
    End Sub ' Push

    ' menghapus objek dari tumpukan
    Public Function Pop() As Object
        Return tumpukan.HapusDariDepan()
    End Function ' Pop

    ' menentukan apakah tumpukan kosong
    Public Function ApaKosong() As Boolean
        Return tumpukan.ApaKosong()
    End Function ' ApaKosong

    ' menampilkan isi tumpukan
    Public Sub Tampil()
        tumpukan.Tampil()
    End Sub ' Tampil

End Class ' CKomposisiTumpukan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' Kode 15.9: UjiKomposisiTumpukan.vb
' Menguji implementasi tumpukan dengan komposisi.

‘ menempatkan beberapa item pada tumpukan dan
‘ menghapus item-item tersebut dari tumpukan


' demonstrasi fungsionalitas implementasi tumpukan
Module modUjiKomposisiTumpukan

    Sub Main()
        Dim tumpukan As CKomposisiTumpukan = New CKomposisiTumpukan()

        ' menciptakan objek-objek untuk disimpan pada tumpukan
        Dim aBoolean As Boolean = True
        Dim aKarakter As Char = Convert.ToChar("$")
        Dim anInteger As Integer = 34567
        Dim aString As String = "hallo"

        ' menggunakan metode Push untuk menambahkan item-item pada tumpukan
        tumpukan.Push(aBoolean) ' menambahkan Boolean
        tumpukan.Tampil()

        tumpukan.Push(aKarakter) ' menambahkan Char
        tumpukan.Tampil()

        tumpukan.Push(anInteger) ' menambahkan Integer
        tumpukan.Tampil()

        tumpukan.Push(aString) ' menambahkan String
        tumpukan.Tampil()

        ' menggunakan metode Pop untuk menghapus item-item dari tumpukan
        Dim objekDihapus As Object = Nothing

        ' menghapus item-item dari tumpukan
        Try

            ' menghapus item dan menampilkan item terhapus
            While True
                objekDihapus = tumpukan.Pop()
                Console.WriteLine(objekDihapus & " dihapus")
                tumpukan.Tampil()
            End While

            ' menangkap eksepsi jika Pop dipanggil ketika tumpukan kosong
        Catch eksepsiSenaraiKosong As EksepsiSenaraiKosong
            Console.Error.WriteLine(eksepsiSenaraiKosong.StackTrace)
        End Try

    End Sub ' Main

End Module ' modUjiKomposisiTumpukan

# tumpukan adalah: 34567 $ True

# tumpukan adalah: hallo 34567 $ True

hallo dihapus
# tumpukan adalah: 34567 $ True

34567 dihapus
# tumpukan adalah: $ True

$ dihapus
# tumpukan adalah: True

True dihapus
Kosong tumpukan
   at CSenarai.HapusDariDepan() in E:\CSenarai.vb:line 65
   at CKomposisiTumpukan.Pop() in E:\CKomposisiTumpukan.vb:line 20
   at modUjiKomposisiTumpukan.Main() in E:\modUjiKomposisiTumpukan.vb:line 38


Antrian
Struktur data lain yang umum dijumpai adalah antrian. Antrian sama seperti antrian di pusat perbelanjaan, dimana orang pertama dalam antrian akan dilayani lebih dahulu, dan para pelanggan lainnya harus menunggu untuk dilayani. Simpul antrian dihapus hanya dari kepala antrian dan disisipkan hanya di ekor antrian. Karena alasan ini, antrian disebut dengan struktur data FIFO (first-in first-out). Operasi penyisipan dan operasi penghapusan dikenal sebagai enqueue dan dequeue.

Program pada kode 15.10 dan kode 15.11 menciptakan sebuah kelas antrian melalui pewarisan dari kelas senarai. Diinginkan bahwa kelas CPewarisanAntrian (kode 15.10) untuk menyertakan metode-metoe Enqueue, Dequeue, ApaKosong, dan Tampil. Perhatikan bahwa secara esensial semua metode tersebut adalah SisipDiBelakang, HapusDariDepan, ApaKosong, dan Tampil dari kelas CSenarai.

Ketika Anda mengimplementasikan metode-metode antrian, setiap pemanggilan metode CPewarisanAntrian akan memanggil metode CSenarai yang sesuai, dimana metode Enqueue memanggil SisipDiBelakang, dan metode Dequeue memangil HapusDariDepan, sedangkan ApaKosong dan Tampil memanggil versi kelas-basisnya.

Module metode Main pada modUjiPewarisanAntrian (kode 15.11) menggunakan kelas CPewarisanAntrian untuk menginstansiasi sebuah antrian Object, dinamai antrian. Baris 15-18 mendefinisikan empat objek yang akan ditempatkan ke dalam antrian dan dihapus dari antrian. Program menempatkan sebuah Boolean dengan nilai True, sebuah Char dengan nilai $, sebuah Integer dengan nilai 34567, dan sebuah String dengan nilai “hallo” ke dalam antrian (baris 21, 24, 27, dan 30).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
' Kode 15.10: PewarisanAntrian.vb
' Mengimplementasikan sebuah antrian dengan mewarisi kelas Senarai.

' menempatkan beberapa item ke dalam antrian dan
' menghapus item-item tersebut dari antrian

' kelas CPewarisanAntrian mewarisi kelas CSenarai
Public Class CPewarisanAntrian
    Inherits CSenarai

    ' melewatkan nama "antrian" kepada konstruktor CSenarai
    Public Sub New()
        MyBase.New("antrian")
    End Sub

    ' menempatkan nilaiData di akhir antrian dengan menyisipkan
    ' nilaiData di akhir senarai berantai
    Public Sub Enqueue(ByVal nilaiData As Object)
        MyBase.SisipDiBelakang(nilaiData)
    End Sub ' Enqueue

    ' menghapus item dari depan antrian dengan menghapus
    ' item di depan senarai berantai
    Public Function Dequeue() As Object
        Return MyBase.HapusDariDepan()
    End Function ' Dequeue

End Class ' CPewarisanAntrian

Loop While tak-hingga (baris 40-44) menghapus elemen-elemen tersebut dari antrian. Ketika tidak ada lagi objek yang akan dihapus, metode Dequeu akan melempar Eksepsi-SenaraiKosong, dan program menampilkan jejak tumpukan eksepsi, yang menggambarkan tumpukan eksekusi program ketika eksepsi terjadi. Program menggunakan metode Tampil (diwarisi dari kelas CSenarai) untuk menampilkan isi tumpukan setelah tiap operasi dilakukan.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
' Kode 15.11: UjiAntrian.vb
' Menguji implementasi antrian dengan pewarisan.

' menempatkan beberapa item ke dalam antrian dan
' menghapus item-item tersebut dari antrian


' demonstrasi fungsionalitas implementasi tumpukan
Module modUjiAntrian

    Sub Main()
        Dim antrian As CPewarisanAntrian = New CPewarisanAntrian()

        ' menciptakan objek-objek untuk disimpan dalam antrian
        Dim aBoolean As Boolean = True
        Dim aKarakter As Char = Convert.ToChar("$")
        Dim anInteger As Integer = 34567
        Dim aString As String = "hallo"

        ' menggunakan metode Enqueue untuk menambahkan item-item dalam antrian
        antrian.Enqueue(aBoolean) ' menambahkan Boolean
        antrian.Tampil()

        antrian.Enqueue(aKarakter) ' menambahkan Char
        antrian.Tampil()

        antrian.Enqueue(anInteger) ' menambahkan Integer
        antrian.Tampil()

        antrian.Enqueue(aString) ' menambahkan String
        antrian.Tampil()

        ' menggunakan metode Dequeue untuk menghapus item-item dari antrian
        Dim objekDihapus As Object = Nothing

        ' menghapus item-item dari antrian
        Try

            ' menghapus item dan menampilkan item terhapus
            While True
                objekDihapus = antrian.Dequeue()
                Console.WriteLine(objekDihapus & " dihapus")
                antrian.Tampil()
            End While

            ' menangkap eksepsi jika Pop dipanggil ketika tumpukan kosong
        Catch eksepsiSenaraiKosong As EksepsiSenaraiKosong
            Console.Error.WriteLine(eksepsiSenaraiKosong.StackTrace)
        End Try

    End Sub ' Main

End Module ' modUjiAntrian

# tumpukan adalah: True

# tumpukan adalah: $ True

# tumpukan adalah: 34567 $ True

# tumpukan adalah: hallo 34567 $ True

hallo dihapus
# tumpukan adalah: 34567 $ True

34567 dihapus
# tumpukan adalah: $ True

$ dihapus
# tumpukan adalah: True

True dihapus
Kosong tumpukan
   at CSenarai.HapusDariDepan() in E:\CSenarai.vb:line 65
   at CKomposisiTumpukan.Pop() in E:\CKomposisiTumpukan.vb:line 20
   at modUjiKomposisiTumpukan.Main() in E:\modUjiKomposisiTumpukan.vb:line 38


Pohon
Senarai berantai, tumpukan, dan antrian adalah struktur data linier. Sebaliknya, pohon adalah struktur data tak-linier, dua dimensi, dengan beberapa sifat spesial. Setiap simpul pada pohon mempunyai dua atau lebih link atau rantai. Bagian ini akan mendiskusikan pohon biner (Gambar 15.7), atau pohon dengan setiap simpul memiliki dua link (tidak ada, satu atau keduanya bisa Nothing). Simpul akar adalah simpul pertama pada pohon. Setiap link pada simpul akar disebut dengan anak. Anak kiri adalah simpul pertama pada subpohon kiri, dan anak kanan adalah simpul pertama pada subpohon kanan. Semua anak dari simpul tertentu disebut dengan sibling atau saudara. Sebuah simpul yang tidak memiliki anak disebut dengan simpul daun.

Contoh pohon-biner yang disajikan akan menciptakan sebuah pohon biner spesial, yang dikenal dengan pohon pencarian biner (binary search tree). Sebuah pohon pencarian biner (tanpa nilai simpul duplikat) memiliki karakteristik bahwa nilai-nilai pada sembarang subpohon kiri lebih rendah dari nilai simpul induk subpohon, dan bahwa nilai-nilai pada sembarang subpohon kanan lebih tinggi dari simpul induk subpohon. Gambar 15.8 mengilustrasikan sebuah pohon pencarian biner yang memuat 12 integer. Perhatikan bahwa bentuk sebuah pohon pencarian biner yang terkait dengan suatu himpunan data sangat bergantung pada urutan penyisipan nilai-nilai ke dalam pohon.



Gambar 15.7 Representasi grafikal atas pohon biner



Gambar 15.8 Pohon pencarian biner yang memuat 12 integer


Pohon Pencarian Biner dengan Nilai-Nilai Integer
Aplikasi pada kode 15.12, kode 15.13, dan kode 15.14 menciptakan sebuah pohon pencarian biner dengan nilai-nilai integer dan kemudian menjelajahi pohon tersebut (berjalan melalui semua simpulnya) dalam tiga cara, yaitu menggunakan penjelajahan inorder, preorder, dan postorder rekursif. Program membangkitkan 10 angka acak dan menyisipkan setiap angka acak itu ke dalam pohon. Kode 15.13 mendefinisikan kelas CPohon. Kode 15.14 mendefinisikan modUjiPohon, yang mendemonstrasikan fungsionalitas kelas CPohon. Metode Main pada modUjiPohon meng-instansiasi sebuah objek CPohon kosong, yang secara acak membangkitkan 10 integer dan menyisipkan setiap nilai ke dalam pohon menggunakan metode SisipSimpul. Program kemudian melakukan penjelajahan pohon secara preorder, inorder, dan postorder.

Kelas CSimpulPohon (kode 15.12) merupakan sebuah kelas referensi-diri yang memuat tiga anggota data Private, yaitu mSimpulKiri dan mSimpulKanan yang keduanya bertipe CSimpulPohon dan mData yang bertipe Integer (baris 5-7). Awalnya, setiap CSimpulPohon adalah simpul daun, jadi konstruktor (baris 10-14) menginisialisasi referensi mSimpulKiri dan mSimpulKanan dengan Nothing. Properti SimpulKiri (baris 17-27), Data (baris 30-40), dan SimpulKanan (baris 45-53) menyediakan akses terhadap anggota-anggota Private kelas CSimpulPohon.

Kelas CPohon (kode 15.13) memanipulasi objek-objek kelas CSimpulPohon. Kelas CPohon memuat sebuah simpul Private akar (baris 5), yaitu sebuah referensi yang menunjuk ke simpul akar pohon. Kelas ini juga memuat anggota Public SisipSimpul (baris 13-26), yang menyisipkan sebuah simpul ke dalam pohon, dan metode-metode Public PenjelajahanPreorder (baris 29-35), PenjelajahanInorder (baris 29-35), dan PenjelajahanPostorder (baris 83-89), yang memulai penjelajahan pohon. Setiap metode penjelajah memanggil metode utilitas rekursif secara terpisah untuk melakukan operasi penjelajahan pada pohon. Konstruktor CPohon (baris 8-10) menginisialisasi akar dengan Nothing untuk mengindikasikan bahwa pohon awalnya kosong.

Metode SisipSimpul pada kelas CPohon pertama-tama mengunci objek CPohon dan kemudian menentukan apakah pohon kosong atau tidak. Jika kosong, baris 19 akan menginstansiasi sebuah objek CSimpulPohon, menginisialisasi simpul dengan integer yang akan disisipkan, dan menugaskan simpul baru kepada akar. Jika pohon tidak kosong, maka metode SisipSimpul akan memanggil metode Sisip (baris 56-84) dari kelas CSimpulPohon, yang secar rekursif menentukan lokasi untuk simpul baru di dalam pohon dan menyisipkan simpul pada lokasi itu.

Metode Sisip pada kelas CSimpulPohon melakukan perbandingan atas nilai yang akan disisipkan dengan nilai mData pada simpul akar. Jika nilai yang akan disisipkan kurang dari data simpul-akar, maka program menentukan apakah subpohon kiri kosong atau tidak (baris 62). Jika kosong, maka baris 63 akan menginstansiasi sebuah objek CSimpulPohon, menginisialisasinya dengan integer yang akan disisipkan, dan menugaskan simpul baru pada referensi mSimpulKiri. Sebaliknya, jika subpohon kiri tidak kosong, maka baris 67 akan secara rekursif memanggil metode Sisip pada subpohon kiri untuk menyisipkan nilai ke dalam subpohon kiri. Jika nilai yang akan disisipkan lebih besar dari data simpul akar, maka program akan menentukan apakah subpohon kanan kosong atau tidak (baris 74). Jika kosong, baris 75 akan menginstansiasi sebuah objek CSimpulPohon, menginisialisasinya dengan integer yang akan disisipkan, dan menugaskan simpul baru kepada referensi mSimpulKanan. Sebaliknya, jika subpohon kanan tidak kosong, maka baris 79 akan secara rekursif memanggil metode Sisip pada subpohon kanan untuk menyisipkan nilai ke dalam subpohon kanan.

Metode-metode PenjelajahanInorder, PenjelajahanPreorder, dan PenjelajahanPostorder memanggil metode-metode pembantu PembantuInorder (baris 65-80), PembantuPreorder (baris 38-53), dan PembantuPostorder (baris 92-107) untuk menjelajah pohon dan menampilkan nilai setiap simpul. Setiap metode pembantu pada kelas CPohon membuat programer dapat mengawali penjelajahan tanpa perlu terlebih dahulu mendapatkan sebuah referensi yang menunjuk ke simpul pertama akar dan kemudian memanggil metode rekursif dengan referensi itu. Metode-metode PenjelajahanInorder, PenjelajahanPreorder, dan PenjelajahanPostorder cukup mengambil referensi Private akar dan melewatkannya kepada metode pembantu yang sesuai untuk mengawali penjelajahan pohon.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
' Kode 15.12: SimpulPohon.vb
' Kelas CSimpulPohon merepresentasikan sebuah simpul pada sebuah CPohon.

Public Class CSimpulPohon
    Private mSimpulKiri As CSimpulPohon
    Private mData As Integer
    Private mSimpulKanan As CSimpulPohon

    ' menginisialisasi data dan membuat sebuah simpul daun
    Public Sub New(ByVal dataSimpul As Integer)
        mData = dataSimpul
        mSimpulKanan = Nothing ' simpul tanpa anak
        mSimpulKiri = Nothing ' simpul tanpa anak
    End Sub ' New

    ' properti SimpulKiri
    Public Property SimpulKiri() As CSimpulPohon

        Get
            Return mSimpulKiri
        End Get

        Set(ByVal nilai As CSimpulPohon)
            mSimpulKiri = nilai
        End Set

    End Property ' SimpulKiri

    ' properti Data
    Public Property Data() As Integer

        Get
            Return mData
        End Get

        Set(ByVal nilai As Integer)
            mData = nilai
        End Set

    End Property ' Data

    ' propert SimpulKanan
    Public Property SimpulKanan() As CSimpulPohon

        Get
            Return mSimpulKanan
        End Get

        Set(ByVal nilai As CSimpulPohon)
            mSimpulKanan = nilai
        End Set

    End Property ' SimpulKanan

    ' menyisipkan simpul ke dalam pohon
    Public Sub Sisip(ByVal nilaiSisip As Integer)

        ' menyisipkan ke subpohon kiri
        If nilaiSisip < mData Then

            ' menyisipkan CSimpulPohon baru
            If mSimpulKiri Is Nothing Then
                SimpulKiri = New CSimpulPohon(nilaiSisip)

                ' melanjutkan penjelajahan subpohon kiri
            Else
                SimpulKiri.Sisip(nilaiSisip)
            End If

            ' menyisipkan ke subpohon kanan
        ElseIf nilaiSisip > mData Then

            ' menyisipkan CSimpulPohon baru
            If SimpulKanan Is Nothing Then
                SimpulKanan = New CSimpulPohon(nilaiSisip)

                ' melanjutkan penjelajahan subpohon kanan
            Else
                SimpulKanan.Sisip(nilaiSisip)
            End If

        End If

    End Sub ' Sisip

End Class ' CSimpulPohon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
' Kode 15.13: Pohon.vb
' Kelas CPohon adalah sebuah pohon yang memuat beberapa CSimpulPohon.

Public Class CPohon
    Private akar As CSimpulPohon

    ' menciptakan sebuah CPohon kosong yang memuat integer-integer
    Public Sub New()
        akar = Nothing
    End Sub ' New

    ' menyisipkan simpul baru ke dalam pohon pencarian biner
    Public Sub SisipSimpul(ByVal nilaiSisip As Integer)

        SyncLock (Me)

            ' jika simpul tidak ada, maka ciptakan simpul
            If akar Is Nothing Then
                akar = New CSimpulPohon(nilaiSisip)
            Else ' sebaliknya sisipkan simpul ke dalam pohon
                akar.Sisip(nilaiSisip)
            End If

        End SyncLock

    End Sub ' SisipSimpul

    ' memulai penjelajahan preorder
    Public Sub PenjelajahanPreorder()

        SyncLock (Me)
            PembantuPreorder(akar)
        End SyncLock

    End Sub ' PreOrderTraversal

    ' metode rekursif untuk melakukan penjelajahan preorder
    Private Sub PembantuPreorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menampilkan data simpul
        Console.Write(simpul.Data & " ")

        ' menjelajah subpohon kiri
        PembantuPreorder(simpul.SimpulKiri)

        ' traverse right subtree
        PembantuPreorder(simpul.SimpulKanan)

    End Sub ' PembantuPreorder

    ' memulai penjelajahan inorder
    Public Sub PenjelajahanInorder()

        SyncLock (Me)
            PembantuInorder(akar)
        End SyncLock

    End Sub ' PenjelajahanInorder

    ' metode rekursif untuk melakukan penjelajahan inorder
    Private Sub PembantuInorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menjelajah subpohon kiri
        PembantuInorder(simpul.SimpulKiri)

        ' menampilkan data simpul
        Console.Write(simpul.Data & " ")

        ' menjelajah subpohon kanan
        PembantuInorder(simpul.SimpulKanan)

    End Sub ' PembantuInorder

    ' memulai penjelajahan postorder
    Public Sub PenjelajahanPostorder()

        SyncLock (Me)
            PembantuPostorder(akar)
        End SyncLock

    End Sub ' PostorderTraversal

    ' metode rekursif untuk melakukan penjelajahan postorder
    Private Sub PembantuPostorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menjelajah subpohon kiri
        PembantuPostorder(simpul.SimpulKiri)

        ' menjelajah subpohon kanan
        PembantuPostorder(simpul.SimpulKanan)

        ' menampilkan data simpul
        Console.Write(simpul.Data & " ")

    End Sub ' PembantuPostorder

End Class ' CPohon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
' Kode 15.14: UjiPohon.vb
' Program ini menguji kelas CPohon.

' Menciptakan objek CPohon
' dan memanfaatkan metode-metode kelas CSimpulPohon

Module modUjiPohon

    ' menguji kelas CPohon
    Sub Main()
        Dim pohon As CPohon = New CPohon()
        Dim nilaiSisip As Integer
        Dim i As Integer

        Console.WriteLine("Sisipkan nilai-nilai: ")
        Dim angkaAcak As Random = New Random()

        ' menyisipkan 10 integer acak dari 0-99 ke dalam pohon
        For i = 1 To 10
            nilaiSisip = angkaAcak.Next(100)
            Console.Write(nilaiSisip & " ")
            pohon.SisipSimpul(nilaiSisip)
        Next

        ' melakukan penjelajahan preorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & "Penjelajahan Preorder")
        pohon.PenjelajahanPreorder()

        ' melakukan penjelajahan inorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & "Penjelajahan Inorder")
        pohon.PenjelajahanInorder()

        ' melakukan penjelajahan postorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & "Penjelajahan Postorder")
        pohon.PenjelajahanPostorder()

        Console.WriteLine()
    End Sub ' Main

End Module ' modUjiPohon

Sisipkan nilai-nilai:
85 65 50 91 23 9 96 54 1 87

Penjelajahan Preorder
85 65 50 23 9 1 54 91 87 96

Penjelajahan Inorder
1 9 23 50 54 65 85 87 91 96

Penjelajahan Postorder
1 9 23 54 50 65 87 96 91 85


Pohon Pencarian Biner dengan Objek-Objek IComparable
Contoh pohon-biner sebelumnya dapat bekerja dengan baik ketika semua data bertipa Integer. Namun, dimisalkan bahwa seorang programer ingin memanipulasi sebuah pohon pencarian biner yang memuat nilai-nilai double, maka ia harus menuliskan-ulang kelas CSimpulPohon dan CPohon sehingga dapat dipakai untuk memanipulasi nilai-nilai double.

Pada contoh selanjutnya, akan digunakan kapabilitas polimorfik pada Visual Basic. Akan diimplementasikan kelas CSimpulPohon dan CPohon, yang memanipulasi objek-objek yang mengimplementasikan antarmuka IComparable (dari namespace System). Kelas yang mengim-plementasikan antarmuka IComparable mendefinisikan metode CompareTo, yang membanding-kan objek yang memanggil metode dengan objek yang diterima metode tersebut sebagai argumen. Metode menghasilkan sebuah nilai Integer yang kurang dari nol jika objek pemanggil kurang dari objek argumen, nol jika kedua objek sama, atau sebuah Integer lebih besar dari nol jika objek pemanggil lebih besar dari objek argumen. Di samping itu, kedua objek pemanggil dan objek argumen harus bertipe data sama; jika tidak, metode akan melemparkan ArgumentException.

Program pada kode 15.15 dan kode 15.16 memperbaiki program sebelumnya untuk memanipulasi objek IComparable. Satu pembatasan pada versi baru dari kelas CSimpulPohon dan CPohon adalah bahwa setiap objek CPohon dapat memuat objek dengan satu tipe data (misalnya, semuanya String atau semuanya Double). Jika program mencoba untuk menyisipkan beberapa data berbeda pada objek CPohon yang sama, maka ArgumentException akan terjadi. Yang dimodifikasi hanyalah tujuh baris kode pada kelas CSimpulPohon (baris 6, 10, 30, 36, 56, 59, dan 71) dan satu baris kode pada kelas CPohon (baris 13) untuk memampukan pemrosesan objek IComparable. Dengan pengecualian pada baris 59 dan 71, semua modifikasi hanya mengganti tipe Integer dengan tipe IComparable. Baris 59 dan 71 sebelumnya menggunakan operator < dan > dalam membandingkan nilai yang disisipkan dengan nilai di dalam simpul tertentu. Kedua baris tersebut sekarang membandingkan objek-objek IComparable menggunakan metode CompareTo; Metode ini dipakai untuk menentukan nilai balik kurang dari nol (objek pemanggil kurang dari objek argumen), nol (objek pemanggil sama dengan objek argumen), atau lebih besar dari nol (objek pemanggil lebih besar dari objek argumen).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
' Kode 15.15: SimpulPohon2.vb
' Kelas CSimpulPohon menggunakan objek-objek IComparable.

Public Class CSimpulPohon
    Private mSimpulKiri As CSimpulPohon
    Private mData As IComparable
    Private mSimpulKanan As CSimpulPohon

    ' menginisialisasi data dan membuat sebuah simpul daun
    Public Sub New(ByVal dataSimpul As IComparable)
        mData = dataSimpul
        mSimpulKanan = Nothing ' simpul tanpa anak
        mSimpulKiri = Nothing ' simpul tanpa anak
    End Sub ' New

    ' properti SimpulKiri
    Public Property SimpulKiri() As CSimpulPohon

        Get
            Return mSimpulKiri
        End Get

        Set(ByVal nilai As CSimpulPohon)
            mSimpulKiri = nilai
        End Set

    End Property ' SimpulKiri

    ' properti Data
    Public Property Data() As IComparable

        Get
            Return mData
        End Get

        Set(ByVal nilai As IComparable)
            mData = nilai
        End Set

    End Property ' Data

    ' propert SimpulKanan
    Public Property SimpulKanan() As CSimpulPohon

        Get
            Return mSimpulKanan
        End Get

        Set(ByVal nilai As CSimpulPohon)
            mSimpulKanan = nilai
        End Set

    End Property ' SimpulKanan

    ' menyisipkan simpul ke dalam pohon
    Public Sub Sisip(ByVal nilaiSisip As IComparable)

        ' menyisipkan ke subpohon kiri
        If nilaiSisip.CompareTo(mData) Then

            ' menyisipkan CSimpulPohon baru
            If mSimpulKiri Is Nothing Then
                SimpulKiri = New CSimpulPohon(nilaiSisip)

                ' melanjutkan penjelajahan subpohon kiri
            Else
                SimpulKiri.Sisip(nilaiSisip)
            End If

            ' menyisipkan ke subpohon kanan
        ElseIf nilaiSisip.CompareTo(mData) Then

            ' menyisipkan CSimpulPohon baru
            If SimpulKanan Is Nothing Then
                SimpulKanan = New CSimpulPohon(nilaiSisip)

                ' melanjutkan penjelajahan subpohon kanan
            Else
                SimpulKanan.Sisip(nilaiSisip)
            End If

        End If

    End Sub ' Sisip

End Class ' CSimpulPohon

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
' Kode 15.16: Pohon.vb
' Kelas CPohon adalah sebuah pohon yang data IComparable.

Public Class CPohon
    Private akar As CSimpulPohon

    ' menciptakan sebuah CPohon kosong yang memuat integer-integer
    Public Sub New()
        akar = Nothing
    End Sub ' New

    ' menyisipkan simpul baru ke dalam pohon pencarian biner
    Public Sub SisipSimpul(ByVal nilaiSisip As IComparable)

        SyncLock (Me)

            ' jika simpul tidak ada, maka ciptakan simpul
            If akar Is Nothing Then
                akar = New CSimpulPohon(nilaiSisip)
            Else ' sebaliknya sisipkan simpul ke dalam pohon
                akar.Sisip(nilaiSisip)
            End If

        End SyncLock

    End Sub ' SisipSimpul

    ' memulai penjelajahan preorder
    Public Sub PenjelajahanPreorder()

        SyncLock (Me)
            PembantuPreorder(akar)
        End SyncLock

    End Sub ' PreOrderTraversal

    ' metode rekursif untuk melakukan penjelajahan preorder
    Private Sub PembantuPreorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menampilkan data simpul
        Console.Write(Convert.ToString(simpul.Data) & " ")

        ' menjelajah subpohon kiri
        PembantuPreorder(simpul.SimpulKiri)

        ' traverse right subtree
        PembantuPreorder(simpul.SimpulKanan)

    End Sub ' PembantuPreorder

    ' memulai penjelajahan inorder
    Public Sub PenjelajahanInorder()

        SyncLock (Me)
            PembantuInorder(akar)
        End SyncLock

    End Sub ' PenjelajahanInorder

    ' metode rekursif untuk melakukan penjelajahan inorder
    Private Sub PembantuInorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menjelajah subpohon kiri
        PembantuInorder(simpul.SimpulKiri)

        ' menampilkan data simpul
        Console.Write(Convert.ToString(simpul.Data) & " ")

        ' menjelajah subpohon kanan
        PembantuInorder(simpul.SimpulKanan)

    End Sub ' PembantuInorder

    ' memulai penjelajahan postorder
    Public Sub PenjelajahanPostorder()

        SyncLock (Me)
            PembantuPostorder(akar)
        End SyncLock

    End Sub ' PostorderTraversal

    ' metode rekursif untuk melakukan penjelajahan postorder
    Private Sub PembantuPostorder(ByVal simpul As CSimpulPohon)

        If simpul Is Nothing Then
            Return
        End If

        ' menjelajah subpohon kiri
        PembantuPostorder(simpul.SimpulKiri)

        ' menjelajah subpohon kanan
        PembantuPostorder(simpul.SimpulKanan)

        ' menampilkan data simpul
        Console.Write(Convert.ToString(simpul.Data) & " ")

    End Sub ' PembantuPostorder

End Class ' CPohon


Module modUjiPohon2 (kode 15.17) menciptakan tiga objek CPohon untuk menyimpan nilai-nilai Integer, Double, dan String, yang semuanya didefinisikan Visual Basic .NET sebagai tipe IComparable. Program mengisi pohon dari nilai-nilai pada array arrayInteger (baris 11), arrayDouble (baris 12-13), dan arrayString (baris 15-16), dan kemudian memanggil metode PenjelajahanPohon untuk menampilkan penjelajahan preorder, inorder, dan postorder atas pohon CPohon. Metode IsiPohon (baris 36-47) menerima sebagai argumen sebuah Array yang memuat nilai-nilai penginisialisasi untuk CPohon, sebuah CPohon yang akan diisi oleh elemen-elemen array, dan sebuah String yang merepresentasikan nama CPohon. Metode IsiTipe kemudian menyisipkan setiap elemen Array ke dalam CPohon.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
' Kode 15.17: UjiPohon2.vb
' Program ini menguji kelas CPohon.

' menciptakan tiga objek CPohon untuk menyimpan
' nilai-nilai Integer, Double, dan String

Module CUjiPohon2

    ' menguji kelas CPohon.
    Sub Main()
        Dim arrayInteger As Integer() = {8, 2, 4, 3, 1, 7, 5, 6}
        Dim arrayDouble As Double() = _
         {8.8, 2.2, 4.4, 3.3, 1.1, 7.7, 5.5, 6.6}

        Dim arrayString As String() = {"delapan", "dua", "empat", _
        "tiga", "satu", "tujuh", "lima", "enam"}

        ' menciptakan pohon Integer
        Dim pohonInteger As CPohon = New CPohon()
        IsiPohon(arrayInteger, pohonInteger, "pohonInteger")
        PenjelajahanPohon(pohonInteger, "pohonInteger")

        ' menciptakan pohon Double
        Dim pohonDouble As CPohon = New CPohon()
        IsiPohon(arrayDouble, pohonDouble, "pohonDouble")
        PenjelajahanPohon(pohonDouble, "pohonDouble")

        ' menciptakan pohon String
        Dim pohonString As CPohon = New CPohon()
        IsiPohon(arrayString, pohonString, "pohonString")
        PenjelajahanPohon(pohonString, "pohonString")

    End Sub ' Main

    ' mengisi pohon dengan elemen-elemen array
    Public Sub IsiPohon(ByVal array As Array, _
    ByVal pohon As CPohon, ByVal nama As String)

        Dim data As IComparable
        Console.WriteLine(vbCrLf & "Disisipkan ke dalam " & nama & ":")

        For Each data In array
            Console.Write(Convert.ToString(data) & " ")
            pohon.SisipSimpul(data)
        Next

    End Sub ' IsiPohon

    ' melakukan penjelajahan
    Public Sub PenjelajahanPohon(ByVal pohon As CPohon, _
    ByVal tipePohon As String)

        ' melakukan penjelajahan preorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & _
        "Penjelajahan Preorder atas " & tipePohon)

        pohon.PenjelajahanPreorder()

        ' melakukan penjelajahan inorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & _
        "Penjelajahan Inorder atas " & tipePohon)

        pohon.PenjelajahanInorder()

        ' melakukan penjelajahan postorder atas pohon
        Console.WriteLine(vbCrLf & vbCrLf & _
        "Penjelajahan Postorder atas " & tipePohon)

        pohon.PenjelajahanPostorder()

        Console.WriteLine(vbCrLf)
    End Sub ' PenjelajahanPohon

End Module ' CUjiPohon2

Disisipkan ke dalam pohonInteger:
8 2 4 3 1 7 5 6

Penjelajahan Preorder atas pohonInteger
8 2 4 3 1 7 5 6

Penjelajahan Inorder atas pohonInteger
6 5 7 1 3 4 2 8

Penjelajahan Postorder atas pohonInteger
6 5 7 1 3 4 2 8

Disisipkan ke dalam pohonDouble:
8.8 2.2 4.4 3.3 1.1 7.7 5.5 6.6

Penjelajahan Preorder atas pohonDouble
8.8 2.2 4.4 3.3 1.1 7.7 5.5 6.6

Penjelajahan Inorder atas pohonDouble
6.6 5.5 7.7 1.1 3.3 4.4 2.2 8.8

Penjelajahan Postorder atas pohonDouble
6.6 5.5 7.7 1.1 3.3 4.4 2.2 8.8

Disisipkan ke dalam pohonString:
delapan dua empat tiga satu tujuh lima enam

Penjelajahan Preorder atas pohonString
delapan dua empat tiga satu tujuh lima enam

Penjelajahan Inorder atas pohonString
enam lima tujuh satu tiga empat dua delapan

Penjelajahan Postorder atas pohonString
enam lima tujuh satu tiga empat dua delapan

Kelas-Kelas Koleksi
Dengan kelas-kelas koleksi, daripada harus menciptakan struktur data sendiri, programer dapat menggunakan struktur data yang ada tanpa perlu khawatir tentang bagaimana struktur data diimplementasikan. Metodologi ini merepresentasikan beberapa contoh pendaur-ulangan kode. Programer dapat mengkode lebih cepat dan dengan kinerja yang lebih baik dalam hal kecepatan eksekusi dan konsumsi memori.

Visual Basic .NET menyediakan beberapa koleksi. Akan didemonstrasikan empat kelas koleksi, yaitu Array, ArrayList, Stack, dan Hashtable. Namespace System.Collections juga menyediakan beberapa struktur data yang lain, termasuk BitArray, Queue, dan SortedList.


Kelas Array
Telah disebutkan bahwa semua array mewarisi kelas Array (namespace System), yang mende-finisikan properti Length yang menspesifikasi jumlah elemen di dalam array. Di samping itu, kelas Array juga menyediakan beberapa metode Shared yang mendefinisikan beberapa algoritma untuk memproses array. Semua metode kelas Array tersebut dioverload untuk memberikan opsi untuk merealisasikan algoritma. Sebagai contoh, metode Reverse dari kelas Array dapat membalikkan urutan elemen-elemen di dalam array secara keseluruhan atau dapat membalikkan elemen-elemen di dalam rentang tertentu pada array. Kode 15.18 mendemonstrasikan beberapa metode Shared dari kelas Array.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
' Kode 15.18: MenggunakanArray.vb
' Menggunakan kelas Array untuk melakukan beberapa manipulasi array.

Imports System.Windows.Forms
Imports System.Collections

' demonstrasi beberapa algoritma kelas Array
Public Class CMenggunakanArray
    Private nilaiInteger As Integer() = {1, 2, 3, 4, 5, 6}
    Private nilaiDouble As Double() = _
        {8.4, 9.3, 0.2, 7.9, 3.4}

    Private salinNilaiInteger(6) As Integer
    Private keluaran As String

    ' membangun dan menampilkan keluaran program
    Public Sub Awal()
        Dim hasil As Integer

        keluaran = "Nilai-nilai awal array:" & vbCrLf
        TampilArray() ' menampilkan isi awal array

        ' mengurutkan nilaiDouble
        Array.Sort(nilaiDouble)

        ' menyalin nilaiInteger ke salinNilaiInteger
        Array.Copy(nilaiInteger, salinNilaiInteger, _
            nilaiInteger.Length)

        keluaran &= vbCrLf & vbCrLf & _
        "Nilai-nilai Array setelah Sort dan Copy:" & vbCrLf

        TampilArray() ' menampilkan isi array
        keluaran &= vbCrLf & vbCrLf

        ' mencari nilai 5 di dalam nilaiInteger
        hasil = Array.BinarySearch(nilaiInteger, 5)

        If hasil >= 0 Then
            keluaran &= "5 ditemukan pada elemen " & hasil & _
            " di dalam nilaiInteger"
        Else
            keluaran &= "5 tidak ditemukan" & " di dalam nilaiInteger"
        End If

        keluaran &= vbCrLf

        ' mencari nilai 8763 di dalam nilaiInteger
        hasil = Array.BinarySearch(nilaiInteger, 8763)

        If hasil >= 0 Then
            keluaran &= "8763 ditemukan pada elemen " & _
             hasil & " di dalam nilaiInteger"
        Else
            keluaran &= "8763 tidak ditemukan" & " di dalam nilaiInteger"
        End If

        MessageBox.Show(keluaran, "Menggunakan Kelas Array", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub ' Awal

    ' menampilkan keluaran
    Private Sub TampilArray()
        Dim elemenDouble As Double
        Dim elemenInteger As Integer

        keluaran &= "nilaiDouble: "

        ' menampilkan setiap elemen di dalam array nilaiDouble
        For Each elemenDouble In nilaiDouble
            keluaran &= elemenDouble & " "
        Next

        keluaran &= vbCrLf & " nilaiInteger: "

        ' menampilkan setiap elemen di dalam array nilaiInteger
        For Each elemenInteger In nilaiInteger
            keluaran &= elemenInteger & " "
        Next

        keluaran &= vbCrLf & " salinNilaiInteger: "

        ' menampilkan setiap elemen array salinNilaiInteger
        For Each elemenInteger In salinNilaiInteger
            keluaran &= elemenInteger & " "
        Next

    End Sub ' TampilArray

    ' entri utama untuk aplikasi
    Shared Sub Main()
        Dim aplikasi As CMenggunakanArray = New CMenggunakanArray()
        aplikasi.Awal()
    End Sub ' Main

End Class ' CMenggunakanArray



Gambar 15.9 Keluaran program pada kode 15.18


Baris 24 menggunakan metode Shared Array, Sort, untuk mengurutkan sebuah array yang memuat nilai-nilai Double. Ketika metode ini selesai dieksekusi, array yang memuat elemen-elemen terurut secara menaik dijadikan nilai balik.

Baris 27-28 menggunakan metode Shared Array, Copy, untuk menyalin setiap elemen array arrayInteger ke dalam array salinArrayInteger. Argumen pertama adalah array yang akan disalin (nilaiInteger), argumen kedua adalah array tujuan penyalinan (salinNilaiInteger), dan argumen ketiga adalah sebuah integer yang merepresentasikan jumlah elemen yang akan disalin (pada kasus ini, properti nilaiInteger.Length menspesifikasi semua elemen akan disalin).

Baris 37 dan 49 memanggil metode Shared Array, BinarySearch, untuk melakukan pencarian biner terhadap array nilaiInteger. Metode BinarySearch menerima array terurut sebagai lokasi pencarian dan kunci untuk dicari. Metode ini menghasilkan indeks di dalam array, dimana di lokasi tersebut ia menemukan kunci yang dicari, atau jika kunci tidak ditemukan, maka metode menghasilkan nilai negatif.


Kelas ArrayList
Koleksi ArrayList pada Visual Basic (namespace System.Collections) menyerupai fungsionalitas array konvensional dan menyediakan kapabilitas pengubahan-ukuran dinamis. Sebuah ArrayList memuat sejumlah elemen, yang kurang dari atau sama dengan kapasitasnya. Jumlah elemen Program dapat memanipulasi kapasitas dengan properti Capacity pada ArrayList. Jika kapasitas  ArrayList perlu diperbesar, maka secara default ia akan menggandakan kapasitasnya.

ArrayList mereferensi Object. Semua kelas diderivasi dari kelas Object, jadi ArrayList dapat memuat objek-objek sembarang tipe. Gambar 15.10 mencantumkan beberapa metode penting dari kelas ArrayList. Kode 15.19 mendemonstrasikan kelas ArrayList dan beberapa metodenya. Pengguna dapat mengentrikan sebuah String ke dalam TextBox dan kemudian menekan sebuah tombol yang merepresentasikan suatu metode ArrayList untuk melihat fungsionalitas metode. TextBox menampilkan pesan yang mengindikasikan hasil tiap operasi.

Metode
Deskripsi
Add



Clear

Contains


IndexOf


Insert

Remove

RemoveAt

RemoveRange


Sort

TrimToSize

Menambahkan sebuah Object ke dalam ArrayList. Menghasilkan sebuah Integer yang menspesifikasi indeks dimana Object tersebut ditambahkan.

Menghapus semua elemen dari ArrayList.

Menghasilkan True jika Object yang dispesifikasi berada di dalam ArrayList; sebaliknya, menghasilkan False.

Menghasilkan indeks dari kemunculan pertama Object yang dispesifikasi di dalam ArrayList.

Menyisipkan sebuah Object pada indeks yang dispesifikasi.

Menghapus kemuculan pertama dari Object yang dispesifikasi.

Menghapus sebuah Object pada indeks yang dispesifikasi.

Menghapus sejumlah elemen tertentu berawal dari indeks yang dispesifikasi di dalam ArrayList.

Mengurutkan ArrayList.

Menetapkan Capacity dari ArrayList menjadi jumlah elemen yang sekarang dimuat di dalam ArrayList.

Gambar 15.10 Beberapa metode ArrayList


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
' Kode 15.19: UjiArrayList.vb
' Demonstrasi fungsionalitas kelas ArrayList.

Imports System.Collections
Imports System.Text
Imports System.Windows.Forms

Public Class FrmArrayList
    Inherits Form

    ' Tombol untuk memanggil fungsionalitas ArrayList
    Friend WithEvents cmdTambahkan As Button
    Friend WithEvents cmdHapus As Button
    Friend WithEvents cmdPertama As Button
    Friend WithEvents cmdAkhir As Button
    Friend WithEvents cmdApaKosong As Button
    Friend WithEvents cmdMemuat As Button
    Friend WithEvents cmdLokasi As Button
    Friend WithEvents cmdPotong As Button
    Friend WithEvents cmdStatistik As Button
    Friend WithEvents cmdTampilkan As Button

    ' TextBox untuk masukan pengguna
    Friend WithEvents txtMasukan As TextBox
    Friend WithEvents lblMasukan As Label

    Friend WithEvents txtKonsol As TextBox ' TextBox untuk keluaran

    ' Visual Studio .NET generated code

    ' ArrayList untuk memanipulasi String
    Private arrayList As ArrayList = New ArrayList(1)

    ' menambahkan item ke akhir arrayList
    Private Sub cmdTambahkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdTambahkan.Click

        arrayList.Add(txtMasukan.Text)
        txtKonsol.Text = "Ditambahkan ke akhir: " & txtMasukan.Text
        txtMasukan.Clear()
    End Sub  ' cmdTambahkan_Click

    'menghapus item yang dispesifikasi dari arrayList
    Private Sub cmdHapus_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdHapus.Click

        arrayList.Remove(txtMasukan.Text)
        txtKonsol.Text = "Dihapus: " & txtMasukan.Text
        txtMasukan.Clear()
    End Sub  ' cmdHapus_Click

    ' menampilkan elemen pertama
    Private Sub cmdPertama_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPertama.Click

        ' mendapatkan elemen pertama
        Try
            txtKonsol.Text = "Elemen pertama: " & arrayList(0)

            ' menampilkan eksepsi jika tidak ada elemen di dalam arrayList
        Catch diluarRentang As ArgumentOutOfRangeException
            txtKonsol.Text = diluarRentang.ToString()
        End Try

    End Sub  ' cmdPertama_Click

    ' menampilkan elemen terakhir
    Private Sub cmdAkhir_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdAkhir.Click

        ' mendapatkan elemen terakhir
        Try
            txtKonsol.Text = "Elemen terakhir: " & _
            arrayList(arrayList.Count - 1)

            ' menampilkan eksepsi jika tidak ada elemen di dalam arrayList
        Catch diluarRentang As ArgumentOutOfRangeException
            txtKonsol.Text = diluarRentang.ToString()
        End Try

    End Sub  ' cmdAkhir_Click

    ' menentukan apakah arrayList kosong atau tidak
    Private Sub cmdApaKosong_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdApaKosong.Click

        If arrayList.Count = 0 Then
            txtKonsol.Text = "arrayList kosong"
        Else
            txtKonsol.Text = "arrayList tidak kosong"
        End If

    End Sub  ' cmdApaKosong_Click

    ' menentukan apakah arrayList memuat objek yang dispesifikasi
    Private Sub cmdMemuat_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdMemuat.Click

        If arrayList.Contains(txtMasukan.Text) Then
            txtKonsol.Text = "arrayList memuat " & _
            txtMasukan.Text()
        Else
            txtKonsol.Text = txtMasukan.Text & " tidak ditemukan"
        End If

    End Sub  ' cmdMemuat_Click

    ' menentukan lokasi dari objek yang dispesifikasi
    Private Sub cmdLokasi_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdLokasi.Click

        txtKonsol.Text = "Elemen berada pada lokasi " & _
            arrayList.IndexOf(txtMasukan.Text)
    End Sub  ' cmdLokasi_Click

    ' memotong arrayList menjadi ukuran sekarang
    Private Sub cmdPotong_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPotong.Click

        arrayList.TrimToSize()
        txtKonsol.Text = "Vektor dipotong menjadi ukuran"
    End Sub  ' cmdPotong_Click

    ' menampilkan ukuran dan kapasitas sekarang dari arrayList
    Private Sub cmdStatistik_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdStatistik.Click

        txtKonsol.Text = "Ukuran = " & arrayList.Count & _
            "; kapasitas = " & arrayList.Capacity
    End Sub  ' cmdStatistik_Click

    ' menampilkan isi arrayList
    Private Sub cmdTampilkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdTampilkan.Click

        Dim enumerator As IEnumerator = arrayList.GetEnumerator()
        Dim buffer As StringBuilder = New StringBuilder()

        While enumerator.MoveNext()
            buffer.Append(enumerator.Current & " ")
        End While

        txtKonsol.Text = buffer.ToString()
    End Sub  ' cmdTampilkan_Click

End Class  ' FrmArrayList


ArrayList pada contoh ini menyimpan beberapa String yang dimasukkan pengguna di dalam TextBox. Baris 32 menciptakan sebuah ArrayList dengan kapasitas awal satu elemen. ArrayList ini akan menggandakan ukurannya setiap kali pengguna mengisi array dan mencoba untuk menambahkan satu elemen lain.

Metode Add pada kelas ArrayList menyambungkan sebuah elemen ke akhir sebuah ArrayList. Ketika pengguna mengklik Tambahkan, event handler cmdTambahkan_Click (baris 35-41) memanggil metode Add (baris 38) untuk menyambung String di dalam TextBox ke dalam ArrayList.



Gambar 15.11  Keluaran program pada kode 15.19


Kelas Stack
Kelas Stack (namespace System.Collections) mengimplementasikan struktur data tumpukan. Aplikasi pada kode 15.10 menyediakan sebuah GUI yang memampukan pengguna untuk menguji beberapa metode kelas Stack. Baris 31 pada konstruktor FrmUjiStack menciptakan sebuah Stack dengan kapasitas awal default (10 elemen).

Kelas Stack menyediakan metode Push dan Pop untuk melakukan beberapa operasi tumpukan dasar. Metode Push mengambil sebuah Object sebagai argumen dan menambahkannya ke atas Stack. Event handler cmdPush_Click (baris 37-42) menggunakan metode Push untuk menambahkan sebuah string yang dimasukkan pengguna ke atas tumpukan.

Metode Pop tidak memerlukan argumen. Metode ini menghapus dan menghasilkan objek yang sekarang berada di atas Stack. Event handler cmdPop_Click (baris 45-57) memanggil metode Pop (baris 50) untuk menghapus sebuah objek dari Stack. Eksepsi InvalidOperatioException akan terjadi jika Stack kosong ketika program memanggil Pop.

Metode Peek menghasilkan nilai dari elemen di atas tumpukan, tetapi tidak menghapus elemen dari Stack. Akan didemonstrasikan Peek pada baris 65 pada event handler cmdPeek_Click (baris 60-72) untuk menengok objek di atas Stack. Sama seperti Pop, Eksepsi InvalidOperatioException akan terjadi jika Stack kosong ketika program memanggil Peek.

Event handler cmdApaKosong_Click (baris 75-84) menentukan apakah Stack kosong dengan membandingkan properti Count pada Stack dengan nol. Jika nol, Stack kosong; sebaliknya, Stack tidak kosong. Event handler cmdCari_Click (baris 87-96) menggunakan metode Contains (baris 90) untuk menentukan apakah Stack memuat objek yang dispesifikasi sebagai argumennya atau tidak. Contains menghasilkan True jika Stack memuat objek yang dispesifikasi dan False jika sebaliknya.

Event handler cmdTampil_Click (baris 99-110) menggunakan sebuah IEnumerator untuk menjelajah Stack dan menampilkan isinya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
' Kode 15.10: UjiStack.vb
' Demonstrasi fungsionalitas kelas Stack.

Imports System.Collections
Imports System.Text
Imports System.Windows.Forms

Public Class FrmUjiStack
    Inherits Form

    ' Tombol untuk memanggil fungsionalitas Stack
    Friend WithEvents cmdPush As Button
    Friend WithEvents cmdPop As Button
    Friend WithEvents cmdPeek As Button
    Friend WithEvents cmdApaKosong As Button
    Friend WithEvents cmdCari As Button
    Friend WithEvents cmdTampil As Button

    ' TextBox menerima masukan dari pengguna
    Friend WithEvents txtMasukan As TextBox
    Friend WithEvents lblStatus As Label
    Friend WithEvents lblMasukan As Label

    Private tumpukan As Stack

    Public Sub New()
        MyBase.New()

        InitializeComponent()

        tumpukan = New Stack() ' menciptakan stack
    End Sub ' New

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' menempatkan elemen ke atas tumpukan
    Private Sub cmdPush_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPush.Click

        tumpukan.Push(txtMasukan.Text)
        lblStatus.Text = "Ditempatkan ke atas tumpukan: " & txtMasukan.Text
    End Sub  ' cmdPush_Click

    ' menghapus elemen dari tumpukan
    Private Sub cmdPop_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPop.Click

        ' menghapus elemen
        Try
            lblStatus.Text = "Dihapus dari tumpukan: " & tumpukan.Pop()

            ' menampilkan pesan jika tumpukan kosong
        Catch invalidOperation As InvalidOperationException
            lblStatus.Text = invalidOperation.ToString()
        End Try

    End Sub  ' cmdPop_Click

    ' mengintip ke elemen teratas tumpukan
    Private Sub cmdPeek_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPeek.Click

        ' menengok elemen atas
        Try
            lblStatus.Text = "Elemen teratas tumpukan: " & tumpukan.Peek()

            ' menampilkan pesan jika tumpukan kosong
        Catch invalidOperation As InvalidOperationException
            lblStatus.Text = invalidOperation.ToString()
        End Try

    End Sub  ' cmdPeek_Click

    ' menentukan apakah tumpukan kosong atau tidak
    Private Sub cmdApaKosong_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdApaKosong.Click

        If tumpukan.Count = 0 Then
            lblStatus.Text = "Tumpukan kosong"
        Else
            lblStatus.Text = "Tumpukan tidak kosong"
        End If

    End Sub  ' cmdApaKosong_Click

    ' menentukan apakah elemen yang dispesifikasi berada pada tumpukan atau tidak
    Private Sub cmdCari_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdCari.Click

        If tumpukan.Contains(txtMasukan.Text) Then
            lblStatus.Text = txtMasukan.Text & " ditemukan"
        Else
            lblStatus.Text = txtMasukan.Text & " tidak ditemukan"
        End If

    End Sub  ' cmdCari_Click

    ' menampilkan isi tumpukan
    Private Sub cmdTampil_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdTampil.Click

        Dim enumerator As IEnumerator = tumpukan.GetEnumerator()
        Dim buffer As StringBuilder = New StringBuilder()

        While enumerator.MoveNext()
            buffer.Append(enumerator.Current & " ")
        End While

        lblStatus.Text = buffer.ToString()
    End Sub  ' cmdTampil_Click

End Class  ' FrmUjiStack



Gambar 15.12  Keluaran program pada kode 15.20


Kelas Hashtable
Sebuah fungsi hash melakukan perhitungan yang dapat dipakai untuk menentukan dimana menempatkan data di dalam hashtable. Fungsi hash diterapkan terhadap sepasang objek kunci/nilai. Kelas Hashtable dapat menerima sembarang objek sebagai kunci. Karena alasan ini, kelas Object mendefinisikan metode GetHashCode, yang diwarisi oleh semua objek Visual Basic. Kode 15.21 mendemonstrasikan beberapa metode dari kelas Hashtable.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
' Kode 15.21: FrmUjiHashtable.vb
' Demonstrasi fungsionalitas kelas Hashtable.

Imports System.Collections
Imports System.Text
Imports System.Windows.Forms

Public Class FrmUjiHashtable
    Inherits Form

    ' Tombol untuk memanggil fungsionalitas Hashtable
    Friend WithEvents cmdTambah As Button
    Friend WithEvents cmdDapatkan As Button
    Friend WithEvents cmdHapus As Button
    Friend WithEvents cmdKosong As Button
    Friend WithEvents cmdMemuat As Button
    Friend WithEvents cmdBersihkan As Button
    Friend WithEvents cmdDaftarObjek As Button
    Friend WithEvents cmdDaftarKunci As Button

    ' TextBox untuk memasukan data hashtable
    Friend WithEvents txtPertama As TextBox
    Friend WithEvents txtAkhir As TextBox
    Friend WithEvents txtKonsol As TextBox

    Friend WithEvents lblPertama As Label
    Friend WithEvents lblAkhir As Label
    Friend WithEvents lblStatus As Label

    Private tabel As Hashtable

    Public Sub New()
        MyBase.New()

        'pemanggilan ini diperlukan oleh Windows Form Designer.
        InitializeComponent()

        tabel = New Hashtable() ' menciptakan objek Hashtable
    End Sub ' New

    ' kode yang dibangkitkan oleh Visual Studio .NET

    ' menambahkan nama akhir dan objek CKaryawan ke dalam tabel
    Private Sub cmdTambah_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdTambah.Click

        Dim karyawan As New CKaryawan(txtPertama.Text, txtAkhir.Text)

        ' menambahkan pasangan kunci/nilai yang baru
        Try
            tabel.Add(txtAkhir.Text, karyawan)
            lblStatus.Text = "Menempatkan: " & karyawan.ToString()

            ' jika kunci tidak ada, lempar eksepsi
        Catch argumentException As ArgumentException
            lblStatus.Text = argumentException.ToString()
        End Try

    End Sub  ' cmdTambah_Click

    ' mendapatkan objek untuk kunci yang dispesifikasi
    Private Sub cmdDapatkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdDapatkan.Click

        Dim hasil As Object = tabel(txtAkhir.Text)

        If Not hasil Is Nothing Then
            lblStatus.Text = "Didapatkan: " & hasil.ToString()
        Else
            lblStatus.Text = "Didapatkan: " & txtAkhir.Text & " tidak ada di dalam tabel"
        End If

    End Sub  ' cmdDapatkan_Click

    ' menghapus pasangan kunci/nilai dari tabel
    Private Sub cmdHapus_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdHapus.Click

        tabel.Remove(txtAkhir.Text)
        lblStatus.Text = "Objek dihapus"
    End Sub  ' cmdHapus_Click

    ' menentukan apakah tabel kosong
    Private Sub cmdKosong_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdKosong.Click

        lblStatus.Text = "Tabel "

        If tabel.Count = 0 Then
            lblStatus.Text &= "kosong"
        Else
            lblStatus.Text &= "tidak kosong"
        End If

    End Sub  ' cmdKosong_Click

    ' menentukan apakah tabel memuat kunci yang dispesifikasi
    Private Sub cmdMemuat_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdMemuat.Click

        lblStatus.Text = "Memuat kunci: " & _
            tabel.ContainsKey(txtAkhir.Text)
    End Sub  ' cmdMemuat_Click

    ' membuang semua isi tabel
    Private Sub cmdBersihkan_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdBersihkan.Click

        tabel.Clear()
        lblStatus.Text = "Dibersihkan: Tabel sekarang kosong"
    End Sub  ' cmdBersihkan_Click

    ' menampilkan semua objek di dalam tabel
    Private Sub cmdDaftarObjek_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
        Handles cmdDaftarObjek.Click

        Dim enumerator As IDictionaryEnumerator = _
            tabel.GetEnumerator()

        Dim buffer As StringBuilder = New StringBuilder()

        While enumerator.MoveNext()
            buffer.Append(Convert.ToString(enumerator.Value) & _
            vbCrLf)
        End While

        txtKonsol.Text = buffer.ToString()
    End Sub  ' cmdDaftarObjek_Click

    ' menampilkan semua kunci di dalam tabel
    Private Sub cmdDaftarKunci_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdDaftarKunci.Click

        Dim enumerator As IDictionaryEnumerator = _
            tabel.GetEnumerator()

        Dim buffer As StringBuilder = New StringBuilder()

        While enumerator.MoveNext()
            buffer.Append(enumerator.Key & vbCrLf)
        End While

        txtKonsol.Text = buffer.ToString()
    End Sub  ' cmdDaftarKunci_Click

End Class  ' FrmUjiHashtable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' Kode 15.22: Karyawan.vb
' Kelas CKarywan untuk digunakan pada HashTable.

Public Class CKaryawan
    Private namaPertama, namaAkhir As String

    Public Sub New(ByVal pertama As String, ByVal akhir As String)
        namaPertama = pertama
        namaAkhir = akhir
    End Sub ' New

    ' menghasilkan nama pertama dan nama akhir Karyawan sebagai String
    Public Overrides Function ToString() As String
        Return namaPertama & " " & namaAkhir
    End Function ' ToString

End Class ' CKaryawan

  


Gambar 15.13  Keluaran program pada kode 15.21


Latihan
1.       Tulislah sebuah program yang menggabungkan dua daftar objek integer terurut menjadi satu daftar objek integer terurut. Metode Merge dari kelas ListMerge harus menerima referensi dari tiap daftar objek untuk digabungkan dan harus menghasilkan sebuah referensi yang menunjuk ke daftar objek hasil penggabungan.


2.       Tulislah sebuah program yang membaca sebaris teks dan kemudian menggunakan sebuah objek tumpukan untuk menampilkan baris teks tersebut secara terbalik.


No comments:

Post a Comment